重写特定.NET类型的序列化 请考虑这个示例类: [Serializable] public class SomeClass { private DateTime _SomeDateTime; public DateTime SomeDateTime { get { return _SomeDateTime; } set { _SomeDateTime = value; } } }

重写特定.NET类型的序列化 请考虑这个示例类: [Serializable] public class SomeClass { private DateTime _SomeDateTime; public DateTime SomeDateTime { get { return _SomeDateTime; } set { _SomeDateTime = value; } } },.net,serialization,overriding,.net,Serialization,Overriding,我想根据自己的规则修改类中声明的任何DateTime的序列化。这个类的成员将经常更改,我不想为每次更改维护一个自定义序列化程序。我还希望这种行为由子类继承,而不是为每个子类编写自定义序列化程序。序列化正在由web服务输出。谢谢你的帮助 您是否考虑过简单地使用可为空的日期时间 public DateTime? SomeDateTime {get; set;} 通过这种方式,实际上可以在类中使用null值作为合法值。通常,您希望尽可能避免自定义序列化。一旦您执行了自定义序列化(如实现),那么您就必

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

您是否考虑过简单地使用可为空的日期时间

public DateTime? SomeDateTime {get; set;}
通过这种方式,实际上可以在类中使用null值作为合法值。通常,您希望尽可能避免自定义序列化。一旦您执行了自定义序列化(如实现),那么您就必须使用它,而所有其他派生类都必须使用它

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

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

公共字符串SomeDateTimeFormatted{ 获取{return theField==DateTime.MinValue?”:theField.ToString(“R”);}//或任何格式 设置{…相反…} }


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

查看OnSerialize和OnDeserialize属性,以便在序列化对象时调用自定义方法。您可以在其中推进一些自定义逻辑,并将序列化过程与实际数据类型解耦。

我通过web服务使用它,因此它会自动转换DateTime?到DateTime.MinValue。我会纠正这个问题。如果这些委托不能使SerializationInfo对象可用,那么如何才能做到这一点呢?好吧,您不需要SerializationInfo对象,因为您应该将streamingcontext传递给使用OnSerialization属性修饰的方法。有关详细信息,请参阅。