开发者

How to refactor a class that is serialized in .NET?

I have a C# class that is serialized to disk by the BinaryFormatter, such as this example:

// Version 3.0
[Serializable]
public class Person
{
    public string FullName;

    [OptionalField(VersionAdded=2)]
    public string NickName;
    [OptionalField(VersionAdded=2)]
    public DateTime BirthDate;

    [OptionalField(VersionAdded=3)]
    public int Weight;
}

Later, I want to refactor this class by one or more of the following

- Change its name

- Chan开发者_高级运维ge its namespace

- Move to another assembly

As far as I can tell, the binary file can only be de-serialized if a class with the exact same name, namespace and assembly name is available.

How do I work around this?

Is it possible to map the de-serialization to a different class name, namespace and assembly without breaking Version Tolerant Serialization?


After some research I realized that the BinaryFormatter does support everything I was looking for.

A BinaryFormatter can use surrogates to

  1. Provides the ability to serialize a type that was not originally designed to be serialized.
  2. Provides a way to map one version of a type to another version of another type.

One can also map deserialization from type A to type B (different class name, namespace and/or assembly name) by using SerializationBinder.

As far as I can tell, this makes it possible to refactor classes that are serialized and to maintain backwards compatibility when making breaking changes that is not supported by versioning alone.

Reference: http://www.diranieh.com/NETSerialization/BinarySerialization.htm

Edit: On a side note, refactoring fields (name or type) is still a pain, as discussed in Renaming fields then deserializing in C#. I am currently looking into protobuf-net to better solve this in the future.


You can implement the ISerializable interface and override GetObjectData to provide your own deserialization. I have not tried, but you should be able to deserialize your old object "manually".

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜