c#-比较包含同一组变量/属性的不同类

c#-比较包含同一组变量/属性的不同类,c#,class,comparison,C#,Class,Comparison,我目前一直在尝试创建类更新程序 有一个可序列化的ClassA,它包含一个整数-,例如一个字符串变量ClassA被强制转换为对象,序列化,然后保存到二进制文件中。 之后有一个程序更新,它将ClassA更改为包含两个整数和字符串变量。旧的ClassA重命名为ClassA\u 0。 从二进制文件加载数据时,反序列化对象作为参数传递给更新程序方法 问题是:如何将该对象与ClassA_0和ClassA进行比较,以确定其保存为的“版本” 编辑: 这些是伪类,因此我没有在构造函数或方法中指定任何代码。Bina

我目前一直在尝试创建类更新程序

有一个可序列化的ClassA,它包含一个整数-,例如一个字符串变量ClassA被强制转换为对象,序列化,然后保存到二进制文件中。 之后有一个程序更新,它将ClassA更改为包含两个整数和字符串变量。旧的ClassA重命名为ClassA\u 0。 从二进制文件加载数据时,反序列化对象作为参数传递给更新程序方法

问题是:如何将该对象与ClassA_0ClassA进行比较,以确定其保存为的“版本”

编辑:


这些是伪类,因此我没有在构造函数或方法中指定任何代码。

BinaryFormatter二进制流的规范是。您可以直接读取流(不使用反序列化器)并从中找出类型

如果这是我,我会看看protobuf net之类的工具(bias:I是作者,但是:all free等),它可以让您更好地控制这些内容。然后我会这样做:

[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
并忽略值-这确保我们用数据序列化一个版本以供以后查找(因为您需要)。我们还可以添加一个
集合
,该集合会抛出有关版本的错误,但我更愿意使其尽可能兼容

VarA
存在并且两者兼容-我们可以使用标记2。其他数据不兼容,因此使用新的不同标签(5);现在我们可以使用
Serializer.Deserialize(…)
,如果您愿意,也可以使用
Serializer.NonGeneric
等效程序,并且数据应该反序列化。但我们也可能只想检查版本-我们可以这样做:

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

现在我们可以使用
序列化程序。对相同的数据反序列化
,它只会反序列化版本标记并放弃所有其他内容。一旦我们知道了版本,我们就可以进行分支,等等。这也可以通过某种形式的继承来完成,但这里似乎有些过分。

如果不知道,您必须事先知道要反序列化到的类型。所以你不能反序列化成,比如说,
对象
,然后试着找出它实际上是什么类型。你能发布ClassA和ClassA_O的类结构“序列化”——如何序列化吗?这是二进制格式化程序吗?如果是的话。。。“我只是不想——你有没有任何灵活性来改变你的序列化方法?”亚历克斯补充道structure@MarcGravell它目前是由BinaryFormatter序列化的,因为它仍然在开发中。我也对其他方法持开放态度。这实际上会有很大帮助。今天晚些时候我会试试,然后再回来。效果很好。谢谢你的帮助!
[ProtoContract]
public class VersionInfo {
    [ProtoMember(1)]
    public int Version {get;set;}
}