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.String
IdTag
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)
还有其他方法吗?
您必须告诉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
代理对象应该正确初始化。