【发布时间】:2013-07-18 17:09:46
【问题描述】:
我有 xml 格式的
<?xml version="1.0" ?>
<manifest attr="TEXT" attr="TEXT" attr="TEXT">
<list name="TRIM">
<feature id="TEXT"/>
<feature id="TEXT"/>
<feature id="TEXT"/>
<feature id="TEXT"/>
<feature id="TEXT"/>
</list>
<list attr="TEXT">
<feature id="TEXT"/>
<feature id="TEXT"/>
</list>
<list attr="TEXT"/>
<list attr="TEXT">
<feature id="TEXT" attr="TEXT"/>
<feature id="TEXT" attr="TEXT"/>
</list>
</manifest>
我正在尝试使用 C# 和 IXmlSerializable 接口对此进行序列化。我有三个类,它们都继承了 IXmlSerializable 接口,我的意图是 XML 将被最顶层的类读取,并且它将循环通过将“list”类型的 xml 传递给子对象序列化器。 “列表”序列化然后依次循环所有“特征”条目。下面是我的代码的精简版。
我已经尝试了几种循环方法,但总是以无限循环结束,由于尝试以错误类型序列化错误的 xml 位而导致错误,或者在跳过整个列表后到达末尾。
我是 Xml 序列化的新手,这种方法很幼稚,我愿意接受任何建议。
此 XML 将来可能会发生变化(更多属性、元素类型等),因此必须是可维护的,我不能保证也不会出现空元素。
using UnityEngine;
using System.Collections;
using System.Xml.Serialization;
[XmlRoot("partManifest")]
public class ModelManifest : IEnumerator, IEnumerable, IXmlSerializable {
[XmlRoot("feature")]
public class Feature : IXmlSerializable
{
string m_id;
string m_description;
#region IXmlSerializable implementation
System.Xml.Schema.XmlSchema System.Xml.Serialization.IXmlSerializable.GetSchema ()
{
throw new System.NotImplementedException ();
}
void System.Xml.Serialization.IXmlSerializable.ReadXml (System.Xml.XmlReader reader)
{
m_id = reader.GetAttribute("id");
}
void System.Xml.Serialization.IXmlSerializable.WriteXml (System.Xml.XmlWriter writer)
{
throw new System.NotImplementedException ();
}
#endregion
}
[XmlRoot("feature-list")]
public class FeatureList : IXmlSerializable
{
string m_name;
System.Collections.Generic.List<Feature> m_features = new System.Collections.Generic.List<Feature>();
#region IXmlSerializable implementation
public System.Xml.Schema.XmlSchema GetSchema ()
{
throw new System.NotImplementedException ();
}
public void ReadXml (System.Xml.XmlReader reader)
{
XmlSerializer valueSerializer = new XmlSerializer(typeof(Feature));
// Will return if no features present
if(reader.IsEmptyElement)
return;
reader.ReadStartElement("feature-list");
while(true)
{
m_features.Add ( (Feature)valueSerializer.Deserialize(reader) );
i++;
bool l_isAnotherSibling = reader.ReadToNextSibling("feature");
if(!l_isAnotherSibling)
break;
}
Debug.Log (i.ToString() + " Features");
}
public void WriteXml (System.Xml.XmlWriter writer)
{
throw new System.NotImplementedException ();
}
#endregion
}
System.Collections.Generic.List<FeatureList> m_featureLists = new System.Collections.Generic.List<FeatureList>();
#region IXmlSerializable implementation
public System.Xml.Schema.XmlSchema GetSchema ()
{
throw new System.NotImplementedException ();
}
public void ReadXml (System.Xml.XmlReader reader)
{
XmlSerializer valueSerializer = new XmlSerializer(typeof(FeatureList));
if(reader.IsEmptyElement)
return;
reader.ReadStartElement("partManifest");
while (true)
{
m_featureLists.Add ( (FeatureList)valueSerializer.Deserialize(reader) );
//bool l_isAnotherSibling = reader.ReadToNextSibling("feature-list");
//if(!l_isAnotherSibling)
// break;
if(reader.NodeType == System.Xml.XmlNodeType.EndElement)
break;
if(Input.GetKeyUp(KeyCode.A))
break;
}
reader.ReadEndElement();
}
public void WriteXml (System.Xml.XmlWriter writer)
{
throw new System.NotImplementedException ();
}
#endregion
}
【问题讨论】:
-
我听说过使用c#属性直接序列化对象,这是否适合Feature类的情况?
-
您是否尝试将其序列化为已定义的 C# 对象?
-
在 Visual Studio 中,您可以右键单击 XML 文件并说“生成架构”。它将为您创建一个 XSD。然后你可以使用像 XSD2Code 这样的工具来生成一个像这样序列化的 C# 类。
-
我正在尝试将其序列化为我定义的 ac# 对象,上面的代码被剥离,这三个类实际上有更多的代码在自动生成中,我知道这样的工具,但过去与他们合作很少成功。此外,正如我所提到的,此 XML 可能会发生变化,每次发生变化时重新集成整个类可能会导致严重的维护问题
标签: c# xml xml-serialization xmlserializer ixmlserializable