我正在使用BinaryFormatter按条件序列化类及其变量。例如:
[Serializable]
public class Class1
{
private Class2 B;
...
}
[Serializable]
public class Class2{...}
我希望变量B仅在远程处理时序列化,但不是在我将其序列化为文件存储时序列化。
问题:
1)我知道在XmlSerialization中我们可以使用[XmlIgnore]和{PropertyName} Specified来有条件地忽略该属性。这是[NonSerialized]的等效方法吗?
2)对于具有[Serializable]属性的类,如何在运行时忽略它?
答案 0 :(得分:0)
ISerializable
来控制序列化,如果这样做,您将知道哪个序列化上下文处于活动状态(远程处理,文件等)。一般来说,我建议您不要使用BinaryFormatter
。如果有的话,这是一个令人头疼的问题。使用XML序列化或某种协议缓冲区。
答案 1 :(得分:0)
如前所述,它不存在。您可以编写出自己的方法,虽然它有点乱(例如,如果你不想像已经建议的那样实现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 { }
你不能忽视它。您只能在运行时更改属性的属性,并且由于NonSerialized属性不采用true / false参数,因此您无法对其进行任何运行。
答案 2 :(得分:0)
我写了一个相当简单但可扩展的框架来使用绑定来解决这类问题。不确定我完全理解但这是可能的:
public class Class1
{
[Ignore]
public bool IsRemoting { get; set; }
[SerializeWhen("IsRemoting", true)]
public Class2 B;
}