自定义类型被序列化为空元素

Posted

技术标签:

【中文标题】自定义类型被序列化为空元素【英文标题】:Custom type is serialized to empty element 【发布时间】:2012-10-07 13:34:23 【问题描述】:

我为 EmailAdres 创建了一个自定义类型,并在一个名为 User 的类中使用了这个类型:

    public class User

public string UserId  get; set; 
public string UserName  get; set; 
public int CompanyId  get; set; 
public EmailAdres Email  get; set; 

[Serializable]
public class EmailAdres 

string _adres;

public EmailAdres()//needed for serialization



public EmailAdres(string s)

  _adres = s;


public static implicit operator EmailAdres(string s)

  return new EmailAdres(s);

public static implicit operator string(EmailAdres s)

  return s._adres;

Web 服务返回 User 对象,但不幸的是,Email 元素呈现为空:

<User>
<UserId>887339</UserId>
<UserName>Behhh, Joyce</UserName>
<CompanyId>6401970</CompanyId>
<Email/>
</User>

我认为隐式转换可以解决问题。

public static implicit operator string(EmailAdres s)

【问题讨论】:

【参考方案1】:

XML 序列化要求一个类必须有一个无参数的 构造函数。

此外,任何非公共的类成员都不会被序列化。 方法没有序列化。以及不具有 get 和 a 的属性 set 访问器未序列化。

序列化嵌套对象不是问题。 .Net 中的一切都是 对象。

编辑:破解这个答案.NET XML serialization

【讨论】:

【参考方案2】:

您确实可以公开 _adres 属性。如果你不想这样做,你可以在你的自定义类上实现接口IXmlSerializable:

public class EmailAdres: IXmlSerializable

   string _adres;

   // other implementation stuff removed

    public void ReadXml(System.Xml.XmlReader reader)
    
        _adres =  reader.ReadElementContentAsString();
    

    public void WriteXml(System.Xml.XmlWriter writer)
    
        writer.WriteValue(_adres);
    

    public System.Xml.Schema.XmlSchema GetSchema()
    
        throw new NotImplementedException();
    

【讨论】:

感谢 Rene,如果我将 _adres 公开,是否仍然可以(例如使用属性)将其呈现为单个元素:adres@server.com 我不这么认为。随意提出一个引用此问题和答案的新问题。

以上是关于自定义类型被序列化为空元素的主要内容,如果未能解决你的问题,请参考以下文章

C#中的类型转换-自定义隐式转换和显式转换

Jackson:为 Map 数据结构注册自定义 XML 序列化程序

.NET 自定义Json序列化时间格式

如何使用json.net自定义反序列化为对象

第五章自定义序列类

init方法的重写与自定义