二进制序列化,IFormatter:每次使用一个新的或在一个字段中存储一个?

Guy*_*ito 5 .net c# serialization

在.net C中第一次使用二进制格式#

MSDN的代码是这样的:

 IFormatter formatter = new BinaryFormatter();
 Stream stream = new FileStream("MyFile.lvl", FileMode.Create, FileAccess.Write,FileShare.None);
 formatter.Serialize(stream, Globals.CurrentLevel);
 stream.Close();
Run Code Online (Sandbox Code Playgroud)

只是想知道我应该IFormatter在我的班级中存储一个字段并一遍又一遍地使用它,还是我应该如上所述并在每次保存/加载某些东西时实例化一个新的?

我注意到它不是IDisposable.

mat*_*mmo 7

重新创建a的开销很小BinaryFormatter,它在构造函数中设置的大多数属性都是enums,请参见此处(感谢Reflector):

public BinaryFormatter()
{
    this.m_typeFormat = FormatterTypeStyle.TypesAlways;
    this.m_securityLevel = TypeFilterLevel.Full;
    this.m_surrogates = null;
    this.m_context = new StreamingContext(StreamingContextStates.All);
}
Run Code Online (Sandbox Code Playgroud)

如果你打算重新使用它,你需要同步访问SerializeDeserialize方法来保持它们的线程安全.

  • 没有读取任何对象本身线程安全吗?由于binaryformatter将流作为参数获取,因此它不会修改任何内部字段(我猜) - 因此为什么需要同步对它的访问? (4认同)
  • 我不能肯定地说,但是`Serialize`正在修改一个名为`m_crossAppDomainArray`的内部字段的内部状态,但据我所知,它只是在Serialize期间写入它,并且只读取Deserialize.因此,如果格式化程序用于序列化和反序列化,则它不是线程安全的.但是,这似乎是一个实现细节,可能会在更高版本的.NET中发生变化.我不认为它是为了线程安全. (2认同)