List <T>的C#二进制序列化,_version

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

使序列化字节数组相同的最简单方法是什么?写一个SerializationSurrogate?在序列化字节数组中查找字段并将其设置为零?手动遍历对象图并使用反射将_version设置为零?我可以使用任何序列化属性吗?也许使用不同的收集类,哪个?

https://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs

编辑:添加了澄清代码:

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);
}

yudian1988 回答:List <T>的C#二进制序列化,_version

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2921663.html

大家都在问