XmlSerializer属性转换器

问题描述 投票:12回答:3

假设我们有一个可以通过XmlSerializer进行序列化/反序列化的类。就像这样:

[XmlRoot("ObjectSummary")]
public class Summary
{
     public string Name {get;set;}
     public string IsValid {get;set;}
}

我们有一个类似这样的xml:

<ObjectSummary>
   <Name>some name</Name>
   <IsValid>Y</IsValid>
<ObjectSummary>

使用布尔属性IsValid而不是字符串属性是更好的决定,但是在这种情况下,我们需要添加一些其他逻辑以将数据从字符串转换为bool。

解决此问题的简单直接方法是使用附加属性,并将一些转换逻辑放入IsValid getter中。

有人可以提出更好的决定吗?要以某种方式或类似方式在属性中使用类型转换器?

c# .net xml-serialization
3个回答
14
投票

将节点作为自定义类型:

[XmlRoot("ObjectSummary")]
public class Summary
{
    public string Name {get;set;}
    public BoolYN IsValid {get;set;}
}

然后在自定义类型上实现IXmlSerializable

public class BoolYN : IXmlSerializable
{
    public bool Value { get; set }

    #region IXmlSerializable members

    public System.Xml.Schema.XmlSchema GetSchema() {
        return null;
    }

    public void ReadXml(System.Xml.XmlReader reader) {
        string str = reader.ReadString();
        reader.ReadEndElement();

        switch (str) {
            case "Y":
                this.Value = true;
                break;
            case "N":
                this.Value = false;
                break;
        }
    }

    public void WriteXml(System.Xml.XmlWriter writer) {
        string str = this.Value ? "Y" : "N";

        writer.WriteString(str);
        writer.WriteEndElement();
    }

    #endregion
}

您甚至可以将该自定义类设置为struct,并在它和bool之间提供隐式转换,以使其更加“透明”。


9
投票

我这样做的方式-这是suboptimal,但还没有找到更好的方法-是定义两个属性:

[XmlRoot("ObjectSummary")]
public class Summary
{
     public string Name {get;set;}
     [XmlIgnore]
     public bool IsValid {get;set;}
     [XmlElement("IsValid")]
     public string IsValidXml {get{ ...};set{...};}

}

用简单的代码替换...,将IsValid值读写到Y和N并从中读取。


0
投票
using Newtonsoft.Json;

[XmlRoot("ObjectSummary")]
public class Summary
{
     public string Name {get;set;}
     public string IsValid {get;set;}
}


 //pass objectr of Summary class you want to convert to XML
 var json = JsonConvert.SerializeObject(obj);
 XNode node = JsonConvert.DeserializeXNode(json, "ObjectSummary");

如果有多个对象,请将其放在列表中并序列化列表。

                dynamic obj = new ExpandoObject();
                obj.data = listOfObjects;
                var json = JsonConvert.SerializeObject(obj);
                XNode node = JsonConvert.DeserializeXNode(json, "ObjectSummary");
© www.soinside.com 2019 - 2024. All rights reserved.