好的,我们可以说我有一个如下所述的课程:
[serializable]
class foobar
{
const int version =1;
List<Object> Bar;
<methods etc n stuff>
}
好的,非常直截了当。
现在,让我们在版本的第2版中添加一个新成员。
[serializable]
class foobar
{
const int version =2;
List<Object> Bar;
public string NickName;
<methods etc n stuff>
}
好的,现在我做了一件非常顽皮的事情。我认为实际上,我不希望Bar成为一个列表,而是一个像自定义列表,具有一些额外功能或隐藏功能。所以我这样做:
[serializable]
class foobar
{
const int version =3;
FooList BarList;
public string NickName;
<methods etc n stuff>
}
好的,这不起作用。因此,我实现自定义序列化并手动将新的barlist设置为反序列化列表并手动读取昵称。到目前为止一切顺利,一切正常。
但是,现在,版本4出现了,我添加了另一个成员参数。我现在必须手动序列化并手动恢复所有参数,使用越来越复杂的序列化和反序列化方法,只是为了支持一个(可能)永远不会实际使用的古老错误
我的问题是这些:
是否有可能在序列化时调用原始的get对象数据方法?也就是说,根据我的理解,有一些逻辑可以做到这一点
If(object implements ISerializable)
object.serialize
else
SerialzeUsingReflection(object) //The "original" way
我可以根据版本决定自定义反序列化,或者,如果我知道没有“缺失”数据属性,请调用原始的反序列化方法吗?
在我的deseralise中,例如
if(version ==2)
{
... //do all the deserialise manually
}
else
{
CallFrameworkOriginalMethod();
}
非常感谢。
答案 0 :(得分:0)
您可以进行所描述的版本控制,但有两件重要的事情需要牢记:
首先,您不应该使用OptionalFieldAttribute的“VersionAdded”属性。在msdn,他们明确表示“此属性未使用且已保留”。这是重要的信息,因为首先,当框架文档说保留某些内容时,您应该避开它。第二,框架文档说它没有被使用,所以即使你继续使用它,你也不应该期望它能够工作。我知道,有another page on msdn解释了“版本容忍序列化”的工作方式,以及您应该如何使用VersionAdded属性。然而,这是他们首先编写应该如何工作的规范但从未实际涉及到实现的情况 - 根据页面VersionAdded应该已经添加了.NET 2.0版本。发生了这种情况,但序列化框架中没有逻辑与该属性相关联。现在我们的版本是4.5,而且逻辑仍未实现。 STEER CLEAR并使用其他东西,具体取决于您是否打算使用第三方实用程序,如“sharpserializer”,或者您打算自己编写。
其次,您询问是否可以调用原始的get对象数据方法。答案是否定的,当你序列化一个对象时,唯一写的就是在字段中证实的状态。不包括方法体的IL。