当复杂的对象包含不可用的DateTime成员时,如何解决序列化exception



我使用WCF将一些对象转换为JSON。有时,有一个错误:

serialization exception:大于dateTime.maxvalue或小于datetime的dateTime值。转换为UTC时的minvalue不能序列化为JSON。

根据这篇文章,我可以通过设置来解决它类型DateTime的对象此方式dt = DateTime.SpecifyKind(dt, DateTimeKind.Utc)。当我的班级没有复合时,这足够解决,例如:

public class MyObj : BaseObj
{
    [XmlElement(Order = 0, ElementName = "name")]
    public string Name { get; set; }
    [XmlElement(Order = 1, ElementName = "xDate")]
    public DateTime? XDate { get; set; }
    [XmlElement(Order = 2, ElementName = "yDate")]
    public DateTime YDate { get; set; }
}
[Serializable]
public class BaseObj
{
    [XmlElement(Order = 0,ElementName = "pDate")]
    public DateTime? PDate { get; set; }
    [XmlElement(Order = 1, ElementName = "qDate")]
    public DateTime QDate { get; set; }
}

编辑:

我实际上并未创建MyObj的实例。我通过了该对象并在其周围创建一个包装器

/*..some factory creates the instance `mo` and returns it...*/
MyObjWrapper wrapped = new MyObjWrapper() {MyObject = mo};
public class MyObjWrapper{
    [XmlIgnore]
    private MyObj _myObject;
    [XmlElement(Order = 0, ElementName = "Arg1")]
    public MyObj MyObject {
        get{ return _myobject; }
        set{
            value.GetType().GetProperties().ToList().ForEach(
                m => { if (m.PropertyType.Equals(typeof(DateTime))) m.SetValue(value, DateTime.SpecifyKind((DateTime)m.GetValue(value), DateTimeKind.Utc)); });
            _myobject = value;
        }
    }
}

当课程更复杂时,我该怎么办(即它的成员也是用户定义的类,其中包含不可解开的日期时间)?我不能将成员设置为可无效的DateTime?。示例:

public class MyObj : BaseObj
{
    [XmlElement(Order = 0, ElementName = "name")]
    public string Name { get; set; }
    [XmlElement(Order = 1, ElementName = "xDate")]
    public DateTime? XDate { get; set; }
    [XmlElement(Order = 2, ElementName = "yDate")]
    public DateTime YDate { get; set; }
    [XmlElement(Order = 3, ElementName = "kaBoom")]
    public AnotherObj KaBoom {get; set;} /*This contains a non-nullable DateTime member which causes the exception */
}
[Serializable]
public class AnotherObj
{
    [XmlElement(Order = 0,ElementName = "objID")]
    public int ObjID {get; set;}
    [XmlElement(Order = 1,ElementName = "anotherDate")]
    public DateTime AnotherDate {get; set;} 
}

您可以在JSON对象定义中使用此解决方法

[IgnoreDataMember]
public DateTime dateObject;
public string dateCustomSerialize
{
 get {
//Custom get
}
set {
//Custom set
}
}

相关内容

最新更新