序列化没有空值

时间:2011-06-17 14:48:07

标签: c# serialization null

让我说我有一个班级

    [Serializable()]
public class Car
{
    public string model;
    public int year;
}

我将其序列化为名为“car.xx”的磁盘。然后我将一个属性添加到我的Car类中,所以它将是这样的:

    [Serializable()]
public class Car
{
    public string model;
    public int year;
    public string colour;
}

然后我将“car.xx”(包含2个字段)反序列化为包含3个字段的当前汽车类,这将使我们的汽车类 null 的“颜色”属性。

如何设置“新属性”不获取空值?在构造函数中设置它们不会有帮助。

我正在使用 BinaryFormatter 序列化程序

我希望将字符串值null替换为“”

2 个答案:

答案 0 :(得分:4)

如果您不使用XmlSerializer,请考虑使用OnDeserializedAttribute,OnSerializingAttribute,OnSerializedAttribute和OnDeserializingAttribute属性

请参阅this

像:

[Serializable()]
public class Car
{
    public string colour;
    public string model;
    public int year;

    [OnDeserialized()]
    internal void OnDeserializedMethod(StreamingContext context)
    {
       if (colour == null)
       {
           colour = string.Empty;
       }
    }
}

答案 1 :(得分:1)

这完全取决于序列化器。

一些序列化器跳过构造函数;一些序列化程序运行默认构造函数。有些让你选择。有些提供序列化回调。

因此取决于序列化器:

  • 编写一个公共无参数构造函数来设置默认值(或使用字段初始化程序,最终类似)
  • 编写“反序列化”序列化回调以在反序列化之前设置默认值

或最糟糕的情况,实现自定义序列化(ISerializable / IXmlSerializable / etc,具体取决于序列化程序)

例如,使用BinaryFormatter

[Serializable]
public class Car : IDeserializationCallback
{
    public string model;
    public int year;
    public string colour;
    void IDeserializationCallback.OnDeserialization(object sender)
    {
        if (colour == null) colour = "";
    }
}

使用其他序列化程序时,可能会使用[OnDeserialized]。注意;我个人不会暴露公共领域,即使是在DTO。但 如果 您正在使用BinaryFormatter,那么现在改变这一点是一个重大变化。为了完整起见,我也不会使用BinaryFormatter - 对此非常友好。其他序列化器可能会对您造成伤害。