2017-05-09 37 views
2

我被卡住目前试图创建一个类更新。C# - 在含有相同的变量/属性比较不同类别的

有一个序列ClassA的包含一个整数 - ,和一个字符串 -variable例如。 ClassA的被转换为对象,系列化,然后保存到一个二进制文件。 之后有一个程序更新,它改变类别A包含两个整数 - 和字符串-变量。老ClassA的更名为ClassA_0。 当数据被加载从二进制文件回来,反序列化对象作为参数的更新器方法传递。

的问题是:如何比较这对象ClassA_0ClassA的到dertermine“版本”它被保存为?

编辑:

[Serializable] 
public class ClassA 
{ 
    int VarA; 
    int VarB; 
    string VarC; 


    public ClassA() 
    { 
     //[...] 
    } 

    public void MethodX() 
    { 
     //[...] 
    } 
} 

[Serializable] 
public class ClassA_0 
{ 
    int VarA; 
    string VarB; 


    public ClassA() 
    { 
     //[...] 
    } 

    public void MethodX() 
    { 
     //[...] 
    } 
} 

这些都是假的班,所以我没有指定在构造函数或方法的任何代码。

+1

您不需要事先知道要反序列化的类型。所以你不能反序列化成“对象”,然后试着找出它的实际类型。 – CodeCaster

+0

您可以发布ClassA和ClassA_O的类结构 – Alex

+0

“序列化” - 序列化如何?这是'BinaryFormatter'吗?如果是的话......我不会 - 你有没有灵活性来改变你的序列化方法? –

回答

1

如果这是我,我会看看像protobuf-net这样的工具(偏见:我是作者,但是:所有免费等),让您更好地控制这些事情。然后我会做这样的事情:

[ProtoContract] 
public class ClassA 
{ 
    [ProtoMember(1) 
    int Version { get { return 1; } set {} } 

    [ProtoMember(2)] 
    int VarA; 
    [ProtoMember(3)] 
    int VarB; 
    [ProtoMember(4)] 
    string VarC; 


    public ClassA() 
    { 
     //[...] 
    } 

    public void MethodX() 
    { 
     //[...] 
    } 
} 

[ProtoContract] 
public class ClassA_0 
{ 
    [ProtoMember(1) 
    int Version { get { return 2; } set {} } 

    [ProtoMember(2)] // this is the same - compatible, keep tag 
    int VarA; 
    [ProtoMember(5)] // not the same: new tag 
    string VarB; 


    public ClassA() 
    { 
     //[...] 
    } 

    public void MethodX() 
    { 
     //[...] 
    } 
} 

注意,有一个在标记1虚拟财产只有一个get和忽略值 - 这确保了我们序列化与后来查找的数据版本(因为你想要的)。我们可能也会添加一个set,它会引发关于该版本的错误,但我希望尽可能使其兼容。

VarA是当前和兼容 - 我们可以使用标签2为。其他数据不兼容,因此使用了新的不同标签(5);现在我们可以使用Serializer.Deserialize<ClassA>(...)Serializer.NonGeneric,如果您愿意,数据应该反序列化。但是,我们也可能只想检查版本 - 我们能做到这一点:

[ProtoContract] 
public class VersionInfo { 
    [ProtoMember(1)] 
    public int Version {get;set;} 
} 

现在我们可以只使用Serializer.Deserialize<VersionInfo>在相同的数据,它只会反序列化的版本标签,并丢弃一切。一旦我们知道版本,我们可以分支等。这可能由某种形式的继承完成,但似乎在这里矫枉过正。

+0

这实际上可以帮助大家。我会在今天晚些时候尝试,然后再回来。 –

+0

工程就像一个魅力。感谢您的帮助! –

0

为BinaryFormatter的二进制流的规范是here。你可以直接读取数据流(不使用解串器)并找出类型

相关问题