如何序列化包含System.Net.IPAddress属性的类?

8

我想序列化一个带有IPAddress属性的类。

public class Person
{
    public IPAddress MasterIP { get; set; }
    public Person(){}
}


public void SerializeMyClass()
{
    Person obj=new Person();
    XmlSerializer xmlSerializer = new XmlSerializer(obj.GetType());
    xmlSerializer.Serialize(obj);
}

但是我遇到了错误:
“无法序列化IP地址,因为它没有空构造函数”

非常重要理解为什么存在这个限制。.NET试图使您摆脱IP地址的表示方式。IPv6对于解决地址空间问题非常重要,它很快就会到来。如果您想进行序列化,则必须选择一种表示方式,例如Int64。 - Hans Passant
我认为您应该提出一个新问题,而不是更改此问题。您得到了一个基于IPAddress为什么不能序列化的答案,但随着您的编辑,它变得无效了。如果您想知道如何序列化Dictionary<IPAddress,string>,请在互联网上搜索,或者如果您在那里找不到,请提出一个新问题。基于此,我将您的问题回滚到第1版。 - default
1个回答

12

您无法 - XmlSerializer只能序列化具有公共无参数构造函数的公共类的公共属性/字段。 您可以查看其他序列化程序类型(如BinaryFormatter),或像这样修改您的类:

public class Person {
  [XmlIgnore]
  public IPAddress MasterIP { get; set; }
  [XmlElement("MasterIP")]
  public string MasterIPForXml {
    get { return MasterIP.ToString(); }
    set { MasterIP = string.IsNullOrEmpty(value) ? null :
      IPAddress.Parse(value); 
    }
  }
}

MaterIPForXML元素需要是公共的吗? - Georg W.
1
@GeorgW. - 是的,XmlSerializer忽略非公共属性。 - Ondrej Svejdar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接