gpt4 book ai didi

c# - XmlSerializer 反序列化类层次结构

转载 作者:行者123 更新时间:2023-11-30 21:00:55 28 4
gpt4 key购买 nike

我在使用 .NET 中的 XmlSerializer 时遇到了一些问题。

这里我有一个我刚刚建立的小例子。 (也可用 @ gist https://gist.github.com/2d84be9041a3f9c06237 )

using System.IO;
using System.Xml.Serialization;

namespace XmlSerializingSample
{
internal class Program
{
private static void Main(string[] args)
{
var specialType = new SpecialType()
{
Id = 1,
Name = "test"
};

var serializer = new XmlSerializer(typeof (SpecialType));
var des = new XmlSerializer(typeof (BaseType));
using (var memeStream = new MemoryStream())
{
serializer.Serialize(memeStream, specialType);
memeStream.Flush();

memeStream.Seek(0, SeekOrigin.Begin);
var instance = des.Deserialize(memeStream); // Here it throws the exception
}
}
}

[XmlInclude(typeof(SpecialType))]
[XmlType("baseType")]
public class BaseType
{
public long Id { get; set; }
}

[XmlRoot("special")]
public class SpecialType : BaseType
{
public string Name { get; set; }
}
}

在代码的第 24 行中,我得到一个 InvalidOperationException 声明“{" wurde nicht erwartet."}"[是的,它是德语]

我发现的所有帖子都指出,在反序列化的基类型上添加 XmlIncludeAttribute 后,这应该可以工作。我是不是忘记了什么?

问候,MacX

最佳答案

问题是你的 Serializer 是这样用根元素序列化 SpecialType 的:

<special ...>
<Id>...

但随后您尝试使用 var des = new XmlSerializer(typeof (BaseType)); 反序列化它,它知道这两种类型,但不知道如何处理 root xml 中的元素。

如果您想让它起作用,您还需要将基类型的根元素设置为序列化为 special。换句话说,您需要这样做:

[XmlInclude(typeof(SpecialType))]
[XmlType("baseType")]
[XmlRoot("special")]
public class BaseType
{
public long Id { get; set; }
}

这样,反序列化器就知道如何将 special 作为根元素处理。

我认为没有其他简单的替代方法可以开箱即用。

更新

这是使用 XmlAttributeOverrides 的另一种选择类。

LinqPad 代码:

void Main()
{
var specialType = new SpecialType()
{
Id = 1,
Name = "test"
};

var serializer = new XmlSerializer(typeof (SpecialType));

XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides();
XmlAttributes attrs = new XmlAttributes();

// Create an XmlRootAttribute to override.
XmlRootAttribute attr = new XmlRootAttribute();
attr.ElementName = "special";

// Add the XmlRootAttribute to the collection of objects.
attrs.XmlRoot=attr;
attrOverrides.Add(typeof(BaseType), attrs);
var des = new XmlSerializer(typeof (BaseType), attrOverrides);

using (var memeStream= new MemoryStream())
{
serializer.Serialize(memeStream, specialType);
memeStream.Flush();

memeStream.Seek(0, SeekOrigin.Begin);
var instance = des.Deserialize(memeStream);
}

}

[XmlInclude(typeof(SpecialType))]
[XmlType("baseType")]
public class BaseType
{
public long Id { get; set; }
}

[XmlRoot("special")]
public class SpecialType : BaseType
{
public string Name { get; set; }
}

关于c# - XmlSerializer 反序列化类层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14585802/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com