如何在序列化和反序列化期间保持引用相等

米沙克斯

我在C#/。NET中进行序列化时遇到问题,如果我在一个流中序列化对同一对象的多个引用,则在反序列化之后,这些引用将不再相等。我正在使用默认的二进制序列化。使我绊倒​​的代码是:

Check ck1 = new Check();
Check ck2 = new Check();
ck1.Numbers = new int[] { 11, 12, 13 };
ck2.Numbers = ck1.Numbers;
Console.WriteLine(ReferenceEquals(ck1.Numbers, ck2.Numbers));
FileStream fs = new FileStream("d:\\deleteme-check3.txt", FileMode.Create, FileAccess.Write);
BinaryFormatter oos = new BinaryFormatter();
oos.Serialize(fs, ck1);
oos.Serialize(fs, ck2);
fs.Flush();
fs.Close();
fs = new FileStream("d:\\deleteme-check3.txt", FileMode.Open, FileAccess.Read);
oos = new BinaryFormatter();
Check ck3 = (Check)oos.Deserialize(fs);
Check ck4 = (Check)oos.Deserialize(fs);
Console.WriteLine(ReferenceEquals(ck3.Numbers, ck4.Numbers));

声明是

[Serializable]
class Check
{
  public int[] Numbers = new int[] { 0, 1, 2 };
}

运行此代码时,我得到TrueFalse我正在寻找可以使用的功能,这些功能可以帮助我TrueTrue

注意#1:我检查了有关使用DataContractSerializer和的参考MarshalByRefObject,但是我看不到如何将这些功能应用于此问题。

注意#2:我知道我可以编写自己的自定义序列化逻辑,但是我想避免这种情况,而是使用默认序列化。例如,如果我在Java中使用默认序列化,那么在这种情况下,我会得到的TrueTrue并且我正在.NET中寻找类似的工具。

马克·格雷韦尔

这根本不会发生。任何保留引用的语义仅对Serialize/的单个调用有效Deserialize为了得到想要的东西,您需要使用某种包装器,即

[Serializable]
public class HazTwo {
   public Check First {get;set;}
   public Check Second {get;set;}
}

然后序列化:

var obj = new HazTwo { First = ck1, Second = ck2 };
oos.Serialize(fs, obj);

并反序列化:

var newObj = (HazTwo)oos.Deserialize(fs);
var ck3 = newObj.First;
var ck4 = newObj.Second;

引用的身份永远不会在对Serailize或的单独调用之间保留Deserialize,只有-的轻微例外,IObjectReference但是由于数组未实现IObjectReference,因此这很无聊。

坦白说,我怀疑您最好选择以下两种方法之一:

  • 使用包装对象,因此对于需要保留引用的作用域,只有一个Serialize/Deserialize调用在起作用
  • 找到不依赖于此的替代设计

我还应该添加脚注,我通常建议人们不要过度使用BinaryForamtter-我已经看到太多的人丢失数据或陷入混乱,通常是在他们的代码版本之间进行迭代时。改变不是很容易。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何序列化和反序列化 Hashtable?

来自分类Dev

在Java中序列化和反序列化后如何保留引用?

来自分类Dev

如何在Windows 8 Store App中序列化和反序列化observableCollection?

来自分类Dev

如何在TFS中反序列化和序列化构建过程参数

来自分类Dev

如何在PHP中正确序列化和反序列化数组?

来自分类Dev

如何在Azure Key Vault中序列化和反序列化PFX证书?

来自分类Dev

如何在TFS中反序列化和序列化构建过程参数

来自分类Dev

如何在PHP中正确序列化和反序列化数组?

来自分类Dev

如何使用XmlSerializer解析反序列化的属性(反序列化期间)?

来自分类Dev

反序列化期间的Kryonet错误

来自分类Dev

反序列化期间的 XML 错误

来自分类Dev

Golang序列化和反序列化

来自分类Dev

序列化和反序列化HttpRequestMessage对象

来自分类Dev

json objcts的序列化和反序列化

来自分类Dev

序列化和反序列化对象集合

来自分类Dev

序列化和反序列化嵌套类

来自分类Dev

Symfony中的序列化和反序列化

来自分类Dev

儿童的序列化和反序列化

来自分类Dev

序列化和反序列化字符

来自分类Dev

序列化和反序列化javascript obj

来自分类Dev

反序列化期间如何忽略$ type

来自分类Dev

在不良JSON反序列化期间,如何忽略异常?

来自分类Dev

反序列化期间如何执行python代码?

来自分类Dev

使用DataContractSerializer和CollectionDataContract反序列化对象引用?

来自分类Dev

如何在Unity中序列化和反序列化包含Gameobject和Vector2的字典

来自分类Dev

如何在 Typescript 中序列化/反序列化复杂对象,例如反序列化对象与序列化对象的类型相同

来自分类Dev

如何玩和Joda:如何通过Scala序列化和反序列化DateTime?

来自分类Dev

如何在Sagemaker 2中使用序列化器和反序列化器

来自分类Dev

WCF-如何在ISO8583中进行序列化和反序列化?

Related 相关文章

  1. 1

    如何序列化和反序列化 Hashtable?

  2. 2

    在Java中序列化和反序列化后如何保留引用?

  3. 3

    如何在Windows 8 Store App中序列化和反序列化observableCollection?

  4. 4

    如何在TFS中反序列化和序列化构建过程参数

  5. 5

    如何在PHP中正确序列化和反序列化数组?

  6. 6

    如何在Azure Key Vault中序列化和反序列化PFX证书?

  7. 7

    如何在TFS中反序列化和序列化构建过程参数

  8. 8

    如何在PHP中正确序列化和反序列化数组?

  9. 9

    如何使用XmlSerializer解析反序列化的属性(反序列化期间)?

  10. 10

    反序列化期间的Kryonet错误

  11. 11

    反序列化期间的 XML 错误

  12. 12

    Golang序列化和反序列化

  13. 13

    序列化和反序列化HttpRequestMessage对象

  14. 14

    json objcts的序列化和反序列化

  15. 15

    序列化和反序列化对象集合

  16. 16

    序列化和反序列化嵌套类

  17. 17

    Symfony中的序列化和反序列化

  18. 18

    儿童的序列化和反序列化

  19. 19

    序列化和反序列化字符

  20. 20

    序列化和反序列化javascript obj

  21. 21

    反序列化期间如何忽略$ type

  22. 22

    在不良JSON反序列化期间,如何忽略异常?

  23. 23

    反序列化期间如何执行python代码?

  24. 24

    使用DataContractSerializer和CollectionDataContract反序列化对象引用?

  25. 25

    如何在Unity中序列化和反序列化包含Gameobject和Vector2的字典

  26. 26

    如何在 Typescript 中序列化/反序列化复杂对象,例如反序列化对象与序列化对象的类型相同

  27. 27

    如何玩和Joda:如何通过Scala序列化和反序列化DateTime?

  28. 28

    如何在Sagemaker 2中使用序列化器和反序列化器

  29. 29

    WCF-如何在ISO8583中进行序列化和反序列化?

热门标签

归档