如何使用 XmlSerializer 在 C# 中反序列化期间将 xml 属性转换为自定义对象
How to convert xml attribute to custom object during deserialization in C# using XmlSerializer
我明白了
InvalidCastException: Value is not a convertible object:
System.String to 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>
样本类:
public class Item
{
[XmlAttribute]
public string Name { get; set; }
[XmlAttribute]
public IdTag ParentId { get; set; }
}
[Serializable]
public class IdTag
{
public string id;
}
异常是从 Convert.ToType()
方法(从 XmlSerializer
调用)中抛出的。据我所知,无法将 System.String
的 "implement" IConvertible
接口转换为 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; }
}
}
还有其他方法吗?
您必须告诉 XmlSerializer
它需要在您的 IdTag
对象中查找什么字符串。据推测,您想要序列化该对象的 属性 (不是整个对象)。
所以,你可以改变这个:
[XmlAttribute]
public IdTag ParentId { get; set; }
对此:
[XmlIgnore]
public IdTag ParentIdTag { get; set; }
[XmlAttribute]
public string ParentId
{
get { return ParentIdTag.id; }
set { ParentIdTag.id = value; }
}
请注意这与您发布的内容之间的区别 - 当您反序列化它时,您的 ParentIdTag
代理对象应该被正确初始化。
我明白了
InvalidCastException: Value is not a convertible object: System.String to 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>
样本类:
public class Item
{
[XmlAttribute]
public string Name { get; set; }
[XmlAttribute]
public IdTag ParentId { get; set; }
}
[Serializable]
public class IdTag
{
public string id;
}
异常是从 Convert.ToType()
方法(从 XmlSerializer
调用)中抛出的。据我所知,无法将 System.String
的 "implement" IConvertible
接口转换为 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; }
}
}
还有其他方法吗?
您必须告诉 XmlSerializer
它需要在您的 IdTag
对象中查找什么字符串。据推测,您想要序列化该对象的 属性 (不是整个对象)。
所以,你可以改变这个:
[XmlAttribute]
public IdTag ParentId { get; set; }
对此:
[XmlIgnore]
public IdTag ParentIdTag { get; set; }
[XmlAttribute]
public string ParentId
{
get { return ParentIdTag.id; }
set { ParentIdTag.id = value; }
}
请注意这与您发布的内容之间的区别 - 当您反序列化它时,您的 ParentIdTag
代理对象应该被正确初始化。