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