条件C#二进制序列化

条件C#二进制序列化,c#,binary-serialization,C#,Binary Serialization,我正在使用BinaryFormatter按条件序列化类及其变量。例如: [Serializable] public class Class1 { private Class2 B; ... } [Serializable] public class Class2{...} 我希望变量B仅在远程处理时序列化,而不是在将其序列化到文件存储时序列化。 问题: 1) 我知道在XmlSerialization中,我们可以使用指定的[XmlIgnore]和{PropertyName}有条件地忽略属性。这

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

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

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

  • 没有这样的方法。您可以通过实现
    ISerializable
    来控制序列化,如果您这样做,您将知道哪个序列化上下文处于活动状态(远程处理、文件等)
  • 既然没办法,你为什么要这个
  • 一般来说,我建议您不要使用
    BinaryFormatter
    。这是一个维护头痛,如果曾经有一个。使用XML序列化或某种协议缓冲区

  • 如前所述,它并不存在。尽管有点混乱,但您可以通过编写代码来解决这个问题(如果您不想按照前面的建议实现ISerializable接口的话)

  • 你不能忽视它。您只能在运行时更改属性的属性,并且由于非序列化属性不接受真/假参数,因此在运行时无法对其执行任何操作


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

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

    非常感谢。在我的例子中,实现ISerializable太单调了,因为类和变量太多了。我对protobuf感兴趣。它还允许自定义序列化吗?因为我正在GetObjectData()期间转换一些值。您不必在所有类中都实现ISerializable,只需在需要自定义逻辑的类中实现ISerializable。Protobuf应该允许自定义序列化,但我不确定它是否适合您的需要;如果您的数据体系结构足够规则(即,对于何时应该序列化哪些内容有明确的规则,很少有例外),那么您最好重新考虑您的数据体系结构或生成自定义序列化代码。
    public class Class1
    {
      [Ignore]
      public bool IsRemoting { get; set; }
    
      [SerializeWhen("IsRemoting", true)]
      public Class2 B;
    }