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

标签 c# xml attributes deserialization 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“实现”IConvertible 接口(interface)以转换为 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 代理对象应该被正确初始化。

关于c# - 如何使用 XmlSerializer 在 C# 中反序列化期间将 xml 属性转换为自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31051177/

相关文章:

c# 使用 Process.Start 发送电子邮件

c# - 如何实现 "swapping"列表?

c# - 我可以从自定义 JsonConverter 的 WriteJson 方法获取属性的属性吗?

c# - 覆盖属性属性

.net - 我应该将服务属性应用于接口(interface)、具体类还是两者?

c# - 如何在 C# 中实现常量正确性?

c# - 父控件的 WPF ContextMenu 在具有自己的 ContextMenu 的子控件上打开

.net - c# 中的 iso-8859-1 到 utf-8

java - xml 字符串到文件

java - 如何将布局和 View 结合起来?