Xml反序列化为System.Type

时间:2018-03-13 11:10:45

标签: c# xml xml-deserialization

我试图将指定.NET类型的XML反序列化为System.Type的实例。给定

<SomeObject>
  <SomeType>System.String, mscorlib</SomeType>
</SomeObject>

反序列化为类;

public class SomeObject
{
    public Type SomeType { get; set; }
}

令人讨厌的是,我在一段时间之前实际上已经完成了这项工作但却无法访问该源代码并且无法记住,鉴于所需的关键字,这已被证明很难研究解决方案(&#34; Xml& #34;,&#34;反序列化&#34;,&#34;键入&#34;在太阳下提供几乎所有东西。)

根据我的记忆,我在Attribute属性上放置了一个简单的SomeTypeXmlSerializer从那里处理它。有谁知道我需要什么属性还是我记错了?

2 个答案:

答案 0 :(得分:1)

如果您不想拥有string类型的其他属性(此问题的常用解决方案) - 您可以使用这样的代理类:

public class XmlTypeProxy : IXmlSerializable {
    private string _typeName;

    public XmlTypeProxy() {

    }

    public XmlTypeProxy(string typeName) {
        _typeName = typeName;
    }

    public XmlSchema GetSchema() {
        return null;
    }

    public void ReadXml(XmlReader reader) {
        _typeName = reader.ReadString();
    }

    public void WriteXml(XmlWriter writer) {
        writer.WriteString(_typeName);
    }

    public static implicit operator Type(XmlTypeProxy self) {
        return Type.GetType(self._typeName);
    }

    public static implicit operator XmlTypeProxy(Type self) {
        return new XmlTypeProxy(self.AssemblyQualifiedName);
    }
}

这个类所做的只是将类型汇编限定名称存储为字符串,并定义来自和Type类型的隐式转换运算符。然后,您只需要使用SomeType属性修饰XmlElement,并指定TypeXmlTypeProxy

public class SomeObject {
    [XmlElement(Type = typeof(XmlTypeProxy))]
    public Type SomeType { get; set; }
}

现在,因为存在从TypeXmlTypeProxy的隐式转换(反之亦然) - 序列化和反序列化都可以按预期工作。

答案 1 :(得分:0)

虽然我已将Evk的答案标记为正确(如果您要反序列化多个Type属性),我实际上最终采用了更简单的方法。

根据this回答,我将SomeObject修改为

public class SomeObject
{
    public string SomeTypeName
    {
        get { return SomeType.AssemblyQualifiedName; }
        set
        {
            var converter = new TypeNameConverter();
            SomeType = (Type)converter.ConvertFrom(value);
        }
    }

    [XmlIgnore]
    public Type SomeType { get; set; }
}

虽然单个属性的代码较短,但它并不像接受的答案那样强大。我在这里录制有两种方法可能会帮助别人。