【问题标题】:XmlSerializer and xsi:typeXmlSerializer 和 xsi:type
【发布时间】:2012-11-24 17:27:19
【问题描述】:

我有以下类,注意B继承A

[XmlInclude(typeof(B))]
public class A
{...}

public class B : A
{...}

B的实例被序列化时,则添加xsi:type属性:

<A xsi:type="B">

为什么会这样?结果应该只是&lt;B&gt;

这是序列化的代码:

var b = new B();
using (var writer = new XmlTextWriterFull(stream, Encoding.UTF8))
{
    writer.Formatting = Formatting.Indented;
    var s = new XmlSerializer(typeof(B));
    s.Serialize(writer, b);
}

这不会发生在我序列化的其他类中。是因为这些类位于不同的命名空间中吗?

我该如何解决这个问题?

【问题讨论】:

  • 如果你展示你如何序列化的代码,人们可以提供更好的帮助。
  • 多么真实,请看我的编辑
  • 我不知道XmlTextWriterFull 是什么,但这有效using (var writer = new StringWriter()) { var s = new XmlSerializer(typeof(B)); s.Serialize(writer, b); var xml = writer.ToString(); }
  • 谢谢,您的解决方案有效。我的例子不完整,我犯了一个严重的思维错误。很抱歉给您添麻烦,我会标记该问题以删除。

标签: c# .net xml serialization


【解决方案1】:

试试这个方法:

    B b = new B();
    byte[] data = SerializeObject(b);
    File.WriteAllBytes("test.xml", data);

这是序列化的代码

    /// <summary>
    /// Serialize object
    /// </summary>
    /// <param name="data"></param>
    /// <returns></returns>
    internal static byte[] SerializeObject(object data)
    {
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        //empty namespace...
        ns.Add("", "");
        XmlSerializer xmlSerializer = new XmlSerializer(data.GetType());
        MemoryStream memStream = new MemoryStream();
        xmlSerializer.Serialize(memStream, data, ns);
        byte[] result = memStream.ToArray();
        memStream.Dispose();
        return result;
    }

而序列化结果是:

<?xml version="1.0"?>
<B>
</B>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    相关资源
    最近更新 更多