I typically do something like this:
[Serializable] public class DigitSeries : ISerializable {
public DigitSeries(SerializationInfo si, StreamingContext sc) {
string version = si.GetString("version");
switch( version ) {
case "1.0":
start = si.GetInt32("start");
end = si.GetInt32("end");
digits = (int[])si.GetValue("digits", typeof(int[]));
default;
case "2.0":
name = si.GetString("name");
goto case "1.0";
}
}
public void GetObjectData(SerializationInfo si, StreamingContext sc) {
si.AddValue("version", version);
si.AddValue("start", start);
si.AddValue("end", end);
si.AddValue("digits", digits);
si.AddValue("name", name);
}
int start; // Version 1.0
int end; // Version 1.0
int[] digits; // Version 1.0
string name; // Added field in version 2.0
static version = "2.0";
}
Chris Sells
http://www.sellsbrothers.com/
> -----Original Message-----
> From: Moderated discussion of advanced .NET topics. [mailto:ADVANCED-
> [EMAIL PROTECTED]] On Behalf Of Craig Andera
> Sent: Saturday, July 06, 2002 7:29 AM
> To: [EMAIL PROTECTED]
> Subject: Re: [ADVANCED-DOTNET] Serialization and assembly version
redirection
>
> Serialization has no way of inherently dealing with version issues.
And
> interfaces don't come in to it - serialization looks at your object's
> internal state via reflection (or a similar mechanism - I don't know
> that it uses reflection per se).
>
> The best way to deal with this problem is to implement ISerializable
and
> implement the two methods (ISerializable::GetObjectData and a private
> constructor) that are required for serialization.
>
> It's really pretty easy - they give you a property bag, and you write
> stuff to it as a series of name-value pairs. The tough part comes in
> when you try to rectify the delta between the old object that was
saved,
> and the new one that you're trying to create. But since only you could
> possibly know how to do this, the runtime leaves it up to you.
>
> > -----Original Message-----
> > From: Moderated discussion of advanced .NET topics.
[mailto:ADVANCED-
> > [EMAIL PROTECTED]] On Behalf Of Paul Currit
> > Sent: Friday, July 05, 2002 2:31 PM
> > To: [EMAIL PROTECTED]
> > Subject: [ADVANCED-DOTNET] Serialization and assembly version
> redirection
> >
> > I am persisting objects to a database using the BinaryFormatter.
When
> > inserting new objects, I call BinaryFormatter.Serialize and store
the
> > object as a byte array in a database table. When getting an object
out
> of
> > the table I use BinaryFormatter.Deserialize to convert the byte
array
> back
> > into the object. If the version of the assembly containing the
> > serializable type changes, can the serialized object in the database
> be
> > deserialized with the newer version. In other words, is there any
way
> to
> > deserialize objects that were originally serialized under a
different
> > version number, as long as the type's interface hasn't changed? Is
> this
> > even an appropriate use of the BinaryFormatter, since it is
typically
> used
> > for ephemeral objects and not persistence?
> >
> > I've tried using the <assemblyBinding> config section, but in my
> tests,
> > deserialization is ignoring the assembly version redirection.
You can read messages from the Advanced DOTNET archive, unsubscribe from Advanced
DOTNET, or
subscribe to other DevelopMentor lists at http://discuss.develop.com.