C# 无ISerializable的.NET二进制有条件序列化
例如,我上了两门课:C# 无ISerializable的.NET二进制有条件序列化,c#,serialization,binary,C#,Serialization,Binary,例如,我上了两门课: public class A { private B b; ... } public class B { ... } 我需要使用BinaryFormatter序列化一个对象。远程处理时,应包括字段b,但序列化到文件时不包括字段b。我补充说: [Serializable] public class A : MarshalByRefObject { private B b; [OnSerializing]
public class A
{
private B b;
...
}
public class B
{
...
}
我需要使用BinaryFormatter序列化一个对象。远程处理时,应包括字段b,但序列化到文件时不包括字段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中一样添加重复的onSerialization()逻辑。类B应该决定做什么,而不是类a或C
我不想使用ISerializable接口,因为类B中有太多的变量必须添加到SerializationInfo
我可以为类B创建SerializationSurrogate,它在GetObjectData()和SetObjectData()中不执行任何操作,然后在序列化到文件时使用它。但是,同样的维护问题也存在,因为无论谁修改类B,都无法注意到序列化过程中将发生什么&serializationsubrogate的存在
有更好的选择吗 这里真正的问题是使用
Serializable
(iow尝试序列化)一个MarshalByRefObject
派生类型,如果对象位于另一个域中,这几乎是不可能的
使用其中一个,但不能同时使用两者。好的,我对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]更新所有字段。维护任务太多
有更好的选择吗 谢谢你的回复。远程处理时使用MarshalByRefObject,文件序列化时使用[Serializable]。我已经测试了这两个共存的作品,没有问题。此外,我不认为MarshalByRefObject可以序列化到文件。谢谢,我记得我在尝试这一点时遇到了很多问题,但您的情况可能与我的实验非常不同。但是从中派生出来,它仍然是
MarshalByRefObject
。它是如何被序列化的(如果不是文件)。1)如果没有[Serializable],当序列化到文件时,它将抛出异常,例如“class B not marked as Serializable…”2)MarshalByRefObject允许在远程处理时跨应用程序域引用对象。使用MarshalByRefObject
,它在远程处理时不会序列化。。。