StreamingContextStates.Clone实际上是做什么的?

8
这本书《CLR Via C#》介绍了一种通过二进制序列化来克隆对象的简单方法。
在创建BinaryFormatter时,它指定了StreamingContextStates.Clone,如下所示:StreamingContextStates.Clone
var formatter = new BinaryFormatter
{
    Context = new StreamingContext(StreamingContextStates.Clone)
};

StreamingContextStates.Clone的文档说它

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

好吧 - 但我不知道这实际上意味着什么。这到底如何改变BinaryFormatter的行为?有人能列出使用此标志的任何具体影响吗?


3
记录一下,我强烈建议在大部分情况下避免使用BinaryFormatter。虽然它有一些方便之处,但我见过太多的人因此而遭受太多的痛苦...事实上,BinaryFormatter中的问题是我几年前深度介入序列化的原因之一。 - Marc Gravell
3
这个属性在 ISerializable.GetObjectData(...) 中被重新暴露,因此从技术上讲,任何实现都有可能根据 StreamingContextStates 的值选择不同的操作。我不知道有多少个实现这样做了,如果有的话。 - Marc Gravell
@MarcGravell 很有趣,谢谢。 (也许下一版的CLR Via C#应该将该示例删除。;) - Matthew Watson
1个回答

2
这里讨论的是序列化。MS提供了一个“抽象”小型框架,可允许对象进行序列化。二进制格式化程序是该小型框架概念的一种具体实现。
开发人员可以选择使用该框架概念来创建自己的自定义格式化程序 - 或者 - MS在创建小型框架时考虑到了序列化的进一步实现。
因此,他们作为框架的一部分提供了这些标志。
回答您特定的问题:对于二进制格式化程序,这些标志将不会产生任何影响,因为它已经被实现为一种工具(如果您愿意),用于跟踪对象图并将其简单地转换为原始数据字节。
如果您创建自己的序列化器,例如可以将对象保存到数据库、文件或共享内存等位置,则希望使用您的序列化器的用户指定相应的标志。
除非我从2003年以来完全误解了MS开发人员.. :) (这是可能的!)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接