IXmlSerializable实现破坏了xml序列化

时间:2014-01-02 15:24:49

标签: c# .net xml serialization xml-serialization

我有一个包含只读字符串的类。因此,我需要手动处理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

1 个答案:

答案 0 :(得分:2)

我怀疑问题是你没有读到包含元素的末尾 - 我怀疑你想要:

public void ReadXml(XmlReader reader)
{
  Name = reader.ReadElementContentAsString();
}

documentation for ReadXml州:

  

调用此方法时,阅读器位于包含类型信息的开始标记上。也就是说,直接在指示序列化对象开始的开始标记上。当此方法返回时,它必须从头到尾读取整个元素,包括其所有内容。与WriteXml方法不同,框架不会自动处理包装元素。您的实施必须这样做。如果不遵守这些定位规则,可能会导致代码生成意外的运行时异常或损坏数据。

ReadString只会读取一个字符串,并在到达end元素标记时停止; ReadElementContentAsString会将阅读器放在结束元素标记之后。

我刚刚用你的样本尝试了上面的代码,它解决了那里的问题,至少。