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
,它在远程处理时不会序列化。。。