【发布时间】:2014-04-14 07:38:05
【问题描述】:
我有一个基类 FDObjectBase,它继承自 ContentControl、ISerializable、INotifyPropertyChanged。现在这个类使用下面的代码逻辑进行反序列化
public FDObjectBase(SerializationInfo info, StreamingContext context) : this()
{
Left = (double)info.GetValue("Left", typeof(double));
Top = (double)info.GetValue("Top", typeof(double));
Height = (double)info.GetValue("Height", typeof(double));
Width = (double)info.GetValue("Width", typeof(double));
DesignObjectID = (int)info.GetValue("DesignObjectID", typeof(int));
ShapeType = (int)info.GetValue("ShapeType", typeof(int));
Angle = (double)info.GetValue("Angle", typeof(double));
try
{
ObjectType = (ObjectType)info.GetValue("ObjectType", typeof(ObjectType));
//this.ToolTip = ObjectType.ToString();
}
catch { }
OnDeserialized(new EventArgs());
//DataObject = (DesignData)info.GetValue("DataObject", typeof(DesignData));
//this.ToolTip = DataObject.Name + " (" + DataObject.ObjectType.ToString().ToLower() + ")";
}
这在应用程序中运行良好,但问题是我希望反序列化过程向后兼容,因为根据要求,对此类的更改不得破坏存储在数据库中的反序列化数据。 我为此找到的解决方案是将 [OptionalField] 属性添加到添加到此类的所有新字段中,但这对我来说并没有解决。当我添加这个类的新字段时,我仍然遇到相同的异常(添加新字段后,反序列化不会发生,并引发以下异常)
System.Reflection.TargetInvocationException was caught
Message=Exception has been thrown by the target of an invocation.
Source=mscorlib
StackTrace:
at System.RuntimeMethodHandle._SerializationInvoke(IRuntimeMethodInfo method, Object target, SignatureStruct& declaringTypeSig, SerializationInfo info, StreamingContext context)
at System.Runtime.Serialization.ObjectManager.CompleteISerializableObject(Object obj, SerializationInfo info, StreamingContext context)
at System.Runtime.Serialization.ObjectManager.FixupSpecialObject(ObjectHolder holder)
at System.Runtime.Serialization.ObjectManager.DoFixups()
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)
at .SeatManagement.Client.Helpers.Generics.Deserialize[T](String data) in Generics.cs:line 117
InnerException: System.Runtime.Serialization.SerializationException
Message=Member 'Test' was not found.
Source=mscorlib
所以我正在寻找在使用可序列化接口时在版本化序列化 c# 方向上的任何建议,这样即使我们向类中添加新字段时它也不会中断。提前感谢您的帮助。
【问题讨论】:
标签: c# serialization