.NET二进制序列化有条件地没有ISerializable

时间:2011-01-07 10:51:10

标签: c# serialization binary

我有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的存在。

有更好的选择吗?

2 个答案:

答案 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]更新所有字段。维护任务太多了。

有更好的选择吗?