条件C#二进制序列化

时间:2010-09-06 03:31:35

标签: c# binary-serialization

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

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

[Serializable]
public class Class2{...}

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

3 个答案:

答案 0 :(得分:0)

  1. 没有这样的方法。您可以通过实现ISerializable来控制序列化,如果这样做,您将知道哪个序列化上下文处于活动状态(远程处理,文件等)。
  2. AFAIK无法做到这一点,你为什么要这样?
  3. 一般来说,我建议您不要使用BinaryFormatter。如果有的话,这是一个令人头疼的问题。使用XML序列化或某种协议缓冲区。

答案 1 :(得分:0)

  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参数,因此您无法对其进行任何运行。

答案 2 :(得分:0)

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

public class Class1
{
  [Ignore]
  public bool IsRemoting { get; set; }

  [SerializeWhen("IsRemoting", true)]
  public Class2 B;
}

http://binaryserializer.codeplex.com