StreamingContextStates.Clone实际上做了什么?

Mat*_*son 8 c# serialization binaryformatter

本书CLR Via C#介绍了一种通过二进制序列化克隆对象的简单方法.

它指定StreamingContextStates.Clone何时创建BinaryFormatter类似:

var formatter = new BinaryFormatter
{
    Context = new StreamingContext(StreamingContextStates.Clone)
};
Run Code Online (Sandbox Code Playgroud)

文档StreamingContextStates.Clone说它

指定正在克隆对象图.用户可以假设克隆的图形将继续存在于同一进程中,并且可以安全地访问句柄或对非托管资源的其他引用.

很公平 - 但我真的不知道这实际意味着什么.这实际上以什么方式改变了行为BinaryFormatter?任何人都可以列出使用此标志的具体效果吗?

G.Y*_*G.Y 2

序列化是这里的主题。
MS 提供了一个“抽象”迷你框架来允许对象的序列化。
二进制格式化程序是该迷你框架概念的具体实现。

在创建进一步实现序列化的迷你框架时,开发人员可以选择使用该框架概念来创建自己的自定义格式化程序 - 或者
MS 本身。

因此他们提供了这些标志作为框架的一部分。

要回答您的具体问题:这些标志不会对二进制格式化程序产生任何影响,因为它已经被实现为一种工具(如果您愿意)来跟踪对象图并将其简单地转换为原始数据的字节。
如果您创建自己的序列化程序,例如可以将对象保存到数据库或文件或共享内存或其他任何位置 - 您会希望使用序列化程序的用户指定相应的标志。

除非我自 2003 年以来就完全误解了 MS 开发人员..:)(这是可能的!)