列表的C#二进制序列化<;T>;,与_版本有关的问题

列表的C#二进制序列化<;T>;,与_版本有关的问题,c#,serialization,binary-serialization,C#,Serialization,Binary Serialization,列表有一个名为_version的私有int字段,每次对列表执行操作时该字段都会递增。不幸的是,对我来说,这个字段在二进制序列化期间也是序列化的,所以两个具有相同内容的列表可以生成不同的字节数组 使序列化字节数组相同的最简单方法是什么?编写序列化代理?在序列化字节数组中查找字段并将其设置为零?手动遍历对象图并使用反射将_version设置为零?是否有我可以使用的序列化属性?可能使用不同的集合类,哪个 编辑:添加代码以澄清: List<string> l1 = new List<

列表有一个名为_version的私有int字段,每次对列表执行操作时该字段都会递增。不幸的是,对我来说,这个字段在二进制序列化期间也是序列化的,所以两个具有相同内容的列表可以生成不同的字节数组

使序列化字节数组相同的最简单方法是什么?编写序列化代理?在序列化字节数组中查找字段并将其设置为零?手动遍历对象图并使用反射将_version设置为零?是否有我可以使用的序列化属性?可能使用不同的集合类,哪个

编辑:添加代码以澄清:

List<string> l1 = new List<string>();
List<string> l2 = new List<string>();
l1.Add("Hi");
l2.Add("Hi");
l2.Clear();
l2.Add("Hi");

byte[] b1 = Serialize(l1);
byte[] b2 = Serialize(l2);   // Contents of b2 will not be the same as b1 

public byte[] Serialize(object o)
{
  using (MemoryStream stream = new MemoryStream())
  {
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(stream, o);
    return stream.ToArray();
  }
}

// One UGLY way, I'm not happy with
private void ClearListVersion(object list)
{
  if (list == null) return;
  FieldInfo fieldInfo = list.GetType().GetField("_version", BindingFlags.NonPublic | BindingFlags.Instance);
  fieldInfo.SetValue(list, 0);
}

List l1=新列表();
列表l2=新列表();
l1.添加(“Hi”);
l2.添加(“Hi”);
l2.Clear();
l2.添加(“Hi”);
字节[]b1=序列化(l1);
字节[]b2=序列化(l2);//b2的内容将与b1不同
公共字节[]序列化(对象o)
{
使用(MemoryStream stream=new MemoryStream())
{
BinaryFormatter formatter=新的BinaryFormatter();
序列化(流,o);
返回流ToArray();
}
}
//一个丑陋的方式,我不满意
私有void ClearListVersion(对象列表)
{
if(list==null)返回;
FieldInfo FieldInfo=list.GetType().GetField(“_version”,BindingFlags.NonPublic | BindingFlags.Instance);
fieldInfo.SetValue(列表,0);
}

我不明白。当字段也被序列化时,内容应该相等,但你是说它们不相等?您正在尝试比较序列化的数据集吗?A看起来是最合理的。将列表转换为代理项内的数组,并将其序列化。但是,对于字典、哈希表和任何其他.Net内置集合,您都会遇到类似的问题,因此如果您的需求是“区分两个对象图”,那么这种方法似乎很脆弱。PMF:正确,我正在比较序列化的字节数组。假设有两个列表对象,它们包含完全相同的字符串。当您将它们序列化为字节数组时,不能保证这些字节数组是相同的。这是因为_version字段。您能告诉我们您试图序列化的实际代码和类型吗?然后,可能会有所帮助。