条件C#二进制序列化

我正在使用BinaryFormatter按条件序列化类及其变量。 例如:

[Serializable] public class Class1 { private Class2 B; ... } [Serializable] public class Class2{...} 

我希望变量B仅在远程处理时序列化,而不是在我将其序列化为文件存储时序列化。 问题:
1)我知道在XmlSerialization中我们可以使用[XmlIgnore]和{PropertyName} Specified来有条件地忽略该属性。 这是[NonSerialized]的等效方法吗?
2)对于具有[Serializable]属性的类,如何在运行时忽略它?

  1. 没有这样的方法。 您可以通过实现ISerializable来控制序列化,如果您这样做,您将知道哪个序列化上下文是活动的(远程处理,文件等)
  2. AFAIK没办法做到这一点,你为什么要这样?

一般来说,我建议你不要使用BinaryFormatter 。 如果有的话,这是一个令人头疼的问题。 使用XML序列化或某种协议缓冲区。

  1. 如前所述,它不存在。 您可以编写出自己的方法,虽然它有点乱(即如果您不想像已经建议的那样实现ISerializable接口)。

     [Serializable] public class ClassA { [OnSerializing] private void OnSerializing(StreamingContext context) { //Set BSerialized = B based on context or some internal boolean BSerialized = B; } [OnSerialized] private void OnSerialized(StreamingContext context) { //Clear BSerialized BSerialized = null; } [OnDeserialized] private void OnDeserialized(StreamingContext context) { //Restore B from BSerialized B = BSerialized; BSerialized = null; } [NonSerialized] private ClassB B; private ClassB BSerialized; } [Serializable] public class ClassB { } 
  2. 你不能忽视它。 您只能在运行时更改属性的属性,并且由于NonSerialized属性不采用true / false参数,因此您无法对其运行时执行任何操作。

我写了一个相当简单但可扩展的框架来使用绑定来解决这类问题。 不确定我完全理解但这是可能的:

 public class Class1 { [Ignore] public bool IsRemoting { get; set; } [SerializeWhen("IsRemoting", true)] public Class2 B; } 

http://binaryserializer.codeplex.com