【问题标题】:Serialization no null values序列化无空值
【发布时间】:2011-06-17 14:48:06
【问题描述】:

假设我有一门课

    [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。 p>

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

我正在使用 BinaryFormatter 序列化程序

我希望将 null 的字符串值替换为 ""

【问题讨论】:

  • 你试过这样设置public string colour = "red";吗?
  • 你想要什么?如果数据中有没有颜色?
  • 我希望它是 "" 而不是 null
  • 请具体说明您使用的是哪个序列化程序。 BinaryFormatterXmlSerializerDataContractSerializerNetDataContractSerializerJavaScriptSerializer 或其他任何内容(第三方等)
  • (更新了BinaryFormatter更新的答案)

标签: c# serialization null


【解决方案1】:

如果您不使用 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;
       }
    }
}

【讨论】:

    【解决方案2】:

    这一切都取决于序列化程序。

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

    所以取决于序列化器:

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

    或者最坏的情况,实现自定义序列化(ISerializable/IXmlSerializable/等,取决于序列化器)

    例如,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 - 它不是对此非常友好。其他序列化程序可用,对您的伤害较小。

    【讨论】:

      猜你喜欢
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 2012-01-13
      • 1970-01-01
      相关资源
      最近更新 更多