C# 从自定义序列化类调用原始反序列化方法?

C# 从自定义序列化类调用原始反序列化方法?,c#,serialization,deserialization,C#,Serialization,Deserialization,好吧,假设我有一个如下所述的类: [serializable] class foobar { const int version =1; List<Object> Bar; <methods etc n stuff> } 然后,我是否可以根据版本决定自定义反序列化,或者,如果我知道将没有丢失的数据属性,是否可以调用原始的反序列化方法 在我的简历中,例如 if(version ==2) { ... //do all the deseria

好吧,假设我有一个如下所述的类:

[serializable]
class foobar
{
    const int version =1;
    List<Object> Bar;

    <methods etc n stuff>
}
然后,我是否可以根据版本决定自定义反序列化,或者,如果我知道将没有丢失的数据属性,是否可以调用原始的反序列化方法

在我的简历中,例如

if(version ==2)
{
    ... //do all the deserialise manually
}
else
{
    CallFrameworkOriginalMethod();
}

非常感谢。

您可以执行您描述的版本控制,但有两件重要的事情需要记住:

首先,您不应该使用OptionalFieldAttribute的VersionAdded属性。他们明确表示,该物业未使用且为保留。这是一个重要的信息,因为首先,当框架文档说有些东西是保留的时,您应该避开它。第二,框架文档说它没有被使用,所以即使你继续使用它,你也不应该期望它能工作。我知道,这解释了版本容忍序列化是如何工作的,以及您应该如何使用VersionAdded属性。然而,这是一个他们首先编写它应该如何工作的规范,但从未真正着手实现的例子-根据页面版本,added应该与.NET的2.0版本一起添加。发生了这种情况,但序列化框架中没有与该属性关联的逻辑。现在我们使用的是4.5版,但该逻辑仍未实现。根据您是否打算使用第三方实用程序(如sharpserializer)或您是否打算自己编写此工具,请避免使用其他工具


其次,询问是否可以调用原始的get object data方法。答案是否定的,当您序列化一个对象时,唯一写入的是字段中证实的状态。不包括来自方法体的IL。

您可以执行所描述的版本控制,但需要记住两件重要的事情:

首先,您不应该使用OptionalFieldAttribute的VersionAdded属性。他们明确表示,该物业未使用且为保留。这是一个重要的信息,因为首先,当框架文档说有些东西是保留的时,您应该避开它。第二,框架文档说它没有被使用,所以即使你继续使用它,你也不应该期望它能工作。我知道,这解释了版本容忍序列化是如何工作的,以及您应该如何使用VersionAdded属性。然而,这是一个他们首先编写它应该如何工作的规范,但从未真正着手实现的例子-根据页面版本,added应该与.NET的2.0版本一起添加。发生了这种情况,但序列化框架中没有与该属性关联的逻辑。现在我们使用的是4.5版,但该逻辑仍未实现。根据您是否打算使用第三方实用程序(如sharpserializer)或您是否打算自己编写此工具,请避免使用其他工具


其次,询问是否可以调用原始的get object data方法。答案是否定的,当您序列化一个对象时,唯一写入的是字段中证实的状态。不包括来自方法体的IL。

我知道这不是一个直接的答案,但您可能想看看-它提供了比.NET的本机二进制序列化程序更好的功能,这包括维护您所追求的向后兼容性。如果你问我,我相信作者会很乐意给你更多的信息。我曾经联系过他,他非常乐于助人。我个人并不参与该项目。我知道这不是一个直接的答案,但你可能想看看-它提供了比.NET的原生二进制序列化程序更好的功能,这包括维护你所追求的向后兼容性。如果你问我,我相信作者会很乐意给你更多的信息。我曾经联系过他,他非常乐于助人。我个人与该项目没有关联。我想你误解了我的问题,我现在更新了我的问题。不过你的OP还是这么认为的,.Net足够聪明,可以在内部进行一些版本控制,并且可以毫无问题地解码版本1。事实并非如此。首先,我想确保您了解,内部没有发生版本控制。实际版本控制不会发生,因为VersionAdded属性未使用和保留。对不起,是的,我理解了版本控制的要点。我假设它发生了一些奇怪的事情,它实际上并没有存储版本值,它只是使用它来确定哪些序列项可以添加。在这一点上,我已经决定,我将包括我自己的版本,我将管理。我现在更新了这个问题,以反映使用ms版本控制机制是愚蠢的。我想你误解了我的问题,我现在更新了我的问题。但是你的OP读到,.Net足够聪明
这里有一些内部版本控制,解码版本1没有任何问题。事实并非如此。首先,我想确保您了解,内部没有发生版本控制。实际版本控制不会发生,因为VersionAdded属性未使用和保留。对不起,是的,我理解了版本控制的要点。我假设它发生了一些奇怪的事情,它实际上并没有存储版本值,它只是使用它来确定哪些序列项可以添加。在这一点上,我已经决定,我将包括我自己的版本,我将管理。我现在更新了这个问题,以反映使用ms版本控制机制是愚蠢的这一事实。
[serializable]
class foobar
{

    const int version =3;
    FooList BarList;  


    public string NickName;


    <methods etc n stuff>
}
If(object implements ISerializable)
   object.serialize
else
   SerialzeUsingReflection(object) //The "original" way
if(version ==2)
{
    ... //do all the deserialise manually
}
else
{
    CallFrameworkOriginalMethod();
}