繁体   English   中英

IXmlSerializable实现破坏了xml序列化

[英]IXmlSerializable implementation ruins 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);
  }
}

然后是包装器类,其中包含我的只读对象和一些值

public class Holder
{
  public RO a;
  public decimal b;
}

现在我序列化和反序列化Holder的实例

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>
*****

但是当我们打印值ab时 ,我们的十进制数为0。尽管我们在xml中看到了234

foo
0

我怀疑问题是您没有读到包含元素的末尾-我怀疑您想这样做:

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

ReadXml文档指出:

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

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

我刚刚在您的示例中尝试了上面的代码,至少可以解决那里的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM