【发布时间】:2018-04-17 14:46:43
【问题描述】:
总结
使用XmlSerializer 类时,使用XmlAttributeOverrides 序列化List<T>(其中T 可以使用XmlSerializer 毫无问题地序列化),例如:
using xmls = System.Xml.Serialization;
...
xmls.XmlAttributeOverrides attributeOverrides = new xmls.XmlAttributeOverrides();
attributeOverrides.Add(typeof(T), new xmls.XmlAttributes()
{
XmlRoot = new xmls.XmlRootAttribute("foo")
});
attributeOverrides.Add(typeof(List<T>), new xmls.XmlAttributes()
{
XmlArray = new xmls.XmlArrayAttribute("foobar"),
XmlArrayItems = { new xmls.XmlArrayItemAttribute("foo") },
});
将在最里面的异常处抛出以下 InvalidOperationExcpetion:
System.InvalidOperationException: XmlRoot and XmlType attributes may not be specified for the type System.Collections.Generic.List`1[[T, programname, Version=versionnumber, Culture=neutral, PublicKeyToken=null]].
我对序列化程序的期望
<texparams>
<texparam pname="TextureMinFilter" value="9729"/>
<texparam pname="TextureMagFilter" value="9729"/>
</texparams>
目前我能成功获得什么
<ArrayOfTextureParameter xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<TextureParameter pname="TextureMinFilter" value="9729" />
<TextureParameter pname="TextureMagFilter" value="9728" />
</ArrayOfTextureParameter>
背景信息
我最近一直在搞乱 XML 序列化,但遇到了一个问题。我正在尝试序列化和反序列化一些包装 OpenGL 纹理的类。
在我的一个类(我恰当地称为BitmapTexture2d)中,我有一个Bitmap 字段,我希望将其存储在一个Base64 元素中,如下所示:
<bitmap64>
*base64goeshere*
</bitmap64>
由于我想让我的代码尽可能简洁,我决定使用IXmlSerializable 接口,而不是创建一个可以来回转换string 和Bitmap 的属性。
在此过程的后期,我决定使用XmlSerializer 类为Texture2d(BitmapTexture2d 派生自)中定义的单个字段生成 XML,该字段称为 Parameters(List<TextureParameter>并且TextureParameter 可以被XmlSerialization 类序列化)。然而,这就是序列化程序默认序列化List<TextureParameter> 的方式:
<ArrayOfTextureParameter xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<TextureParameter pname="TextureMinFilter" value="9729" />
<TextureParameter pname="TextureMagFilter" value="9728" />
</ArrayOfTextureParameter>
看到这个后,我决定尝试更改节点的名称。经过一些研究(我多次登陆 stackoverflow)我发现了 XmlAttributeOverrides 类,它可以传递给 XmlSerializer 的构造函数以添加/覆盖节点名称等。
写出我的代码后,子序列化程序的构造函数开始抛出异常,如上所述。我尝试使用一个引发相同异常的数组。后来我虽然将列表中的每个元素一个一个地序列化,但得出的结论是,以这种方式实现它比我想象的要难。我在其他地方发布了这个问题,没有答案。我在这里……
【问题讨论】:
标签: c# xml list serialization