我有2节课,例如:
public class A
{
private B b;
...
}
public class B
{
...
}
我需要使用BinaryFormatter序列化对象A.远程处理时,它应包括字段b,但不包括序列化为文件。这是我添加的内容:
[Serializable]
public class A : MarshalByRefObject
{
private B b;
[OnSerializing]
private void OnSerializing(StreamingContext context)
{
if (context.State == StreamingContextStates.File)
{
this.b = null;
}
}
...
}
[Serializable]
public class B : MarshalByRefObject
{
...
}
我认为这是一个糟糕的设计,因为如果另一个C类也包含B,那么在C类中我们必须像A一样添加重复的OnSerializing()逻辑.B类应该决定做什么,而不是A类或C. / p>
我不想使用ISerializable接口,因为必须将B类中的太多变量添加到SerializationInfo。
我可以为B类创建一个SerializationSurrogate,它在GetObjectData()& SetObjectData(),然后在序列化到文件时使用它。然而同样的维护问题是因为修改B类的人无法注意到序列化过程中会发生什么。 SerializationSurrogate的存在。
有更好的选择吗?
答案 0 :(得分:0)
真正的问题在于使用Serializable
(我试图序列化)MarshalByRefObject
派生类型,如果对象位于另一个域中,这几乎是不可能的。
使用其中一个,但不能同时使用两者。
答案 1 :(得分:0)
好吧,我对MarshalByRefObject有误解。它没有序列化,因此我可以使用[NonSerializable]进行文件序列化。
尽管如此,我确实有一些标有[Serializable]的类,以便在远程处理时按值进行编组。因此需要将其与文件序列化区分开来:
[Serializable]
public class A
{
private B b;
[OnSerializing]
private void OnSerializing(StreamingContext context)
{
if (context.State == StreamingContextStates.File)
{
this.b = null;
}
}
...
}
[Serializable]
public class B
{
...
}
[NonSerialized]在这种情况下无效,因为:
1)远程处理时需要序列化字段b而不是磁盘序列化字段
2)如果C,D,E等类也有字段b,则必须用[NonSerialized]更新所有字段。维护任务太多了。
有更好的选择吗?