覆盖特定.NET类型的序列化

时间:2008-10-06 11:06:58

标签: .net serialization override

请考虑这个示例类:

[Serializable]
public class SomeClass
{
    private DateTime _SomeDateTime;

    public DateTime SomeDateTime
    {
        get { return _SomeDateTime; }
        set { _SomeDateTime = value; }
    }
}

我想根据自己的规则更改类中声明的任何DateTime的序列化。此类的成员将经常更改,我不想为每个更改维护自定义序列化程序。此外,我希望子行程继承此行为,而不是为每个行为编写自定义序列化程序。序列化由Web服务输出。谢谢你的帮助!

3 个答案:

答案 0 :(得分:3)

您是否考虑过简单地使用Nullable日期时间

public DateTime? SomeDateTime {get; set;}

这样,您实际上可以将null值作为类中的合法值。通常,您希望尽可能避免自定义序列化。一旦您执行自定义序列化,例如实施 ISerializable ,那么您就会陷入困境,并且所有其他派生类都会坚持使用它。

还记得,对于自定义异常,必须始终覆盖ISerializable成员的痛苦是什么?这是因为System.Exception实现了ISerializable,因此所有派生的异常(这意味着一切)必须实现这些成员,如果您希望它们跨越AppDomains。

答案 1 :(得分:3)

查看OnSerializing和OnDeserializing属性,以在序列化对象时调用自定义方法。你可以在那里强制一些自定义逻辑,并将序列化过程与实际数据类型分离。

答案 2 :(得分:0)

好吧,您可以使用“bool ShouldSerializeSomeDateTime()”方法来启用/禁用单个成员的序列化,但我认为这不是您所需要的。另一个常见选项是添加一个执行格式化的成员:

public string SomeDateTimeFormatted {     get {return theField == DateTime.MinValue? “”:theField.ToString(“R”);} //或任何格式     设置{...对面...}   }

如果可以的话,坚持使用内置序列化会更好 - 部分原因是为了减少需要编写的代码量。 Josh关于可以为空的DateTime(DateTime?)的建议是一个很好的建议,虽然它可能仍然不是很空 - 字符串与格式化字符串 - 我希望它会使用xsi:nil标记。