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

时间:2012-10-17 10:05:10

标签: .net xml serializable

我为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)

2 个答案:

答案 0 :(得分:1)

XML序列化要求类必须具有无参数 构造

此外,任何非公开的类成员都不会被序列化。 方法未序列化。并且没有get和a的属性 set accessor未序列化。

序列化嵌套对象不是问题。 .Net中的所有内容都是 对象

编辑:查看这个答案.NET XML serialization

答案 1 :(得分:0)

您确实可以将_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();
    }

}