让我说我有一个班级
[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替换为“”
答案 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
- 对此非常友好。其他序列化器可能会对您造成伤害。