假设我们有一个可以通过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中。
有人可以提出更好的决定吗?要以某种方式或类似方式在属性中使用类型转换器?
将节点作为自定义类型:
[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
之间提供隐式转换,以使其更加“透明”。
我这样做的方式-这是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并从中读取。
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");