Eug*_*rov 5 c# xml xml-serialization xmlserializer
我的xml文件反序列化有问题.让我们假设我们有一个xml文件和一个我们用于反序列化的类.
例如:
xml -
<dataStore>
<name>newDataStore1</name>
<description>sdffasdfasdf</description>
<type>Shapefile</type>
<enabled>false</enabled>
<workspace>
<name>newTestWorkspace</name>
<atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="ht
tp://192.168.6.71:8080/geoserver/rest/workspaces/newTestWorkspace.xml" type="app
lication/xml"/>
</workspace>
<connectionParameters>
<entry key="memory mapped buffer">false</entry>
<entry key="create spatial index">true</entry>
<entry key="charset">ISO-8859-1</entry>
<entry key="filetype">shapefile</entry>
<entry key="cache and reuse memory maps">true</entry>
<entry key="url">file:data/shapefiles/states.shp</entry>
<entry key="namespace">http://www.opengeospatial.net/cite</entry>
</connectionParameters>
<__default>false</__default>
<featureTypes>
<atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="ht
tp://192.168.6.71:8080/geoserver/rest/workspaces/newTestWorkspace/datastores/new
DataStore1/featuretypes.xml" type="application/xml"/>
</featureTypes>
</dataStore>
Run Code Online (Sandbox Code Playgroud)
类
namespace GeoServerApiTester
{
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.225")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlRootAttribute("dataStore", Namespace="", IsNullable=false)]
public partial class DataStore
{
private string nameField;
private string typeField;
private bool enabledField;
private WorkSpacePreview workspaceField;
private ConnectionParametersStorageEntryCollection connectionParametersField;
private string @__defaultField;
private LinkCollection featureTypesField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0, ElementName="name")]
public string Name
{
get
{
return this.nameField;
}
set
{
this.nameField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1, ElementName="type")]
public string Type
{
get
{
return this.typeField;
}
set
{
this.typeField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=2, ElementName="enabled")]
public bool Enabled
{
get
{
return this.enabledField;
}
set
{
this.enabledField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=3, ElementName="workspace")]
public WorkSpacePreview Workspace
{
get
{
return this.workspaceField;
}
set
{
this.workspaceField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlArrayAttribute(Order=4, ElementName="connectionParameters")]
[System.Xml.Serialization.XmlArrayItemAttribute("entry", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)]
public ConnectionParametersStorageEntryCollection ConnectionParameters
{
get
{
return this.connectionParametersField;
}
set
{
this.connectionParametersField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=5)]
public string @__default
{
get
{
return this.@__defaultField;
}
set
{
this.@__defaultField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlArrayAttribute(Order=6, ElementName="featureTypes")]
[System.Xml.Serialization.XmlArrayItemAttribute("link", Namespace="http://www.w3.org/2005/Atom", IsNullable=false)]
public LinkCollection FeatureTypes
{
get
{
return this.featureTypesField;
}
set
{
this.featureTypesField = value;
}
}
public virtual bool ShouldSerializeConnectionParameters()
{
return ((this.ConnectionParameters != null)
&& (this.ConnectionParameters.Count > 0));
}
public virtual bool ShouldSerializeFeatureTypes()
{
return ((this.FeatureTypes != null)
&& (this.FeatureTypes.Count > 0));
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以看到该类不包含description字段.
<dataStore>
<name>newDataStore1</name>
<enabled>false</enabled>
</dataStore>
Run Code Online (Sandbox Code Playgroud)
您可以看到描述后的所有元素都没有反序列化.
当程序获取xml内容并且此xml包含一个不在该类中的元素时,此元素之后的所有元素都不会被预期化.
如何在反序列化期间跳过未知元素并获得如下内容:
<dataStore>
<name>newDataStore1</name>
<type>Shapefile</type>
<enabled>false</enabled>
<workspace>
<name>newTestWorkspace</name>
<atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="ht
tp://192.168.6.71:8080/geoserver/rest/workspaces/newTestWorkspace.xml" type="app
lication/xml"/>
</workspace>
<connectionParameters>
<entry key="memory mapped buffer">false</entry>
<entry key="create spatial index">true</entry>
<entry key="charset">ISO-8859-1</entry>
<entry key="filetype">shapefile</entry>
<entry key="cache and reuse memory maps">true</entry>
<entry key="url">file:data/shapefiles/states.shp</entry>
<entry key="namespace">http://www.opengeospatial.net/cite</entry>
</connectionParameters>
<__default>false</__default>
<featureTypes>
<atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="ht
tp://192.168.6.71:8080/geoserver/rest/workspaces/newTestWorkspace/datastores/new
DataStore1/featuretypes.xml" type="application/xml"/>
</featureTypes>
</dataStore>
Run Code Online (Sandbox Code Playgroud)
仅删除元素
默认情况下,XmlSerializer会忽略未知节点(因此也会忽略这些元素).现在,当您使用Order属性时,您明确告知要序列化/反序列化的顺序.
因此,当XmlSerializer到达您的description元素时,这将成为一个未知元素,因为它需要该type元素.其余的也将作为未知元素进行威胁,因为它们不再映射到您指定的顺序.例如,当涉及到你type的XML中具有索引2的enabled元素时,它期望它是元素,因此该元素也变得未知.
您可以通过处理XmlSerializer类的UnknownNode事件来检查此行为.将针对遇到的每个未知节点触发此事件.
如何进行?如果排序没有意义,请不要使用它.在某些情况下,使用排序确实有意义.我多次见过的一个经典例子是(遗留)应用程序,它将XML文档视为字符串并从上到下读取所有元素.
另一种选择是实现IXmlSerializer接口,它可以更好地控制对象的序列化和反序列化方式.