如何使用XmlSerializer在C#中反序列化期间将xml属性转换为自定义对象

Chr*_*ski 7 c# xml attributes xmlserializer deserialization

我明白了

InvalidCastException:Value不是可转换对象:System.String到IdTag

尝试反序列化xml属性时.

这是示例xml:

<?xml version="1.0" encoding="windows-1250"?>
<ArrayOfItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Item Name="Item Name" ParentId="SampleId" />
</ArrayOfItem>
Run Code Online (Sandbox Code Playgroud)

样本类:

public class Item
{
   [XmlAttribute]
   public string Name { get; set; }

   [XmlAttribute]
   public IdTag ParentId { get; set; }
}

[Serializable]
public class IdTag
{
    public string id;
}
Run Code Online (Sandbox Code Playgroud)

Convert.ToType()方法(从中调用XmlSerializer)抛出异常.AFAIK没有办法"实现" 转换为的IConvertible接口.我知道我可以实现代理属性,即:System.StringIdTag

public class Item
{
    [XmlAttribute]
    public string Name {get; set;}

    [XmlAttribute("ParentId")]
    public string _ParentId { get; set; }

    [XmlIgnore]
    public IdTag ParentId 
    { 
        get { return new IdTag(_ParentId); } 
        set { _ParentId = value.id; }
    }
}
Run Code Online (Sandbox Code Playgroud)

还有其他方法吗?

Dan*_*eld 2

您必须告诉XmlSerializer它需要在您的对象中查找什么字符串IdTag。据推测,您想要序列化该对象的一个​​属性(而不是整个对象)。

所以,你可以改变这个:

[XmlAttribute]
public IdTag ParentId { get; set; }
Run Code Online (Sandbox Code Playgroud)

对此:

[XmlIgnore]
public IdTag ParentIdTag { get; set; }

[XmlAttribute]
public string ParentId 
{ 
    get { return ParentIdTag.id; } 
    set { ParentIdTag.id = value; } 
}
Run Code Online (Sandbox Code Playgroud)

请注意这与您发布的内容之间的区别 - 当您反序列化它时,您的ParentIdTag代理对象应该正确初始化。