我有一个包含只读字符串的类。因此,我需要手动处理xmlserialization。但似乎在具有自动xml序列化的更宏大的设置中使用此类会破坏反序列化过程。
首先是我的只读课程
public class RO : IXmlSerializable
{
public string Name { get; private set; }
// for serialization
protected RO(){}
public RO(string name)
{
this.Name = name;
}
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
Name = reader.ReadString();
}
public void WriteXml(XmlWriter writer)
{
writer.WriteString(Name);
}
}
然后是一个包装类,包含我的readonly对象和一些值
public class Holder
{
public RO a;
public decimal b;
}
现在我序列化和反序列化持有者的实例
class Program
{
static void Main(string[] args)
{
XmlSerializer xml = new XmlSerializer(typeof(Holder));
var s = new StringWriter();
var holder = new Holder() { a = new RO("foo"), b = 234 };
xml.Serialize(s, holder);
string ss = s.ToString();
Console.WriteLine("*****");
Console.WriteLine(ss);
Console.WriteLine("*****");
holder = (Holder) xml.Deserialize(new StringReader(ss));
Console.WriteLine(holder.a.Name);
Console.WriteLine(holder.b);
}
}
屏幕上的是一个漂亮的xml
*****
<?xml version="1.0" encoding="utf-16"?>
<Holder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://
www.w3.org/2001/XMLSchema">
<a>foo</a>
<b>234</b>
</Holder>
*****
但是当我们打印值 a 和 b 时,我们得到 0 的十进制..尽管我们看到 234 < / strong>在xml中
foo
0
答案 0 :(得分:2)
我怀疑问题是你没有读到包含元素的末尾 - 我怀疑你想要:
public void ReadXml(XmlReader reader)
{
Name = reader.ReadElementContentAsString();
}
调用此方法时,阅读器位于包含类型信息的开始标记上。也就是说,直接在指示序列化对象开始的开始标记上。当此方法返回时,它必须从头到尾读取整个元素,包括其所有内容。与WriteXml方法不同,框架不会自动处理包装元素。您的实施必须这样做。如果不遵守这些定位规则,可能会导致代码生成意外的运行时异常或损坏数据。
ReadString
只会读取一个字符串,并在到达end元素标记时停止; ReadElementContentAsString
会将阅读器放在结束元素标记之后。
我刚刚用你的样本尝试了上面的代码,它解决了那里的问题,至少。