在使用xml进行对象与字符串序列化与反序列化时,遇到如下问题:
代码
[System.CodeDom.Compiler.GeneratedCodeAttribute( " xsd " , " 2.0.50727.1432 " )] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute( " code " )] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true , Namespace = " http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition " )] [System.Xml.Serialization.XmlRootAttribute(Namespace = " http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition " , IsNullable = false )] public partial class Report : IReport { private object [] itemsField; private ReportItemsElementNameType[] itemsElementNameField; private System.Xml.XmlAttribute[] anyAttrField; /// <remarks/> [System.Xml.Serialization.XmlAnyElementAttribute()] [System.Xml.Serialization.XmlElementAttribute( " Author " , typeof ( string ))] [System.Xml.Serialization.XmlElementAttribute( " AutoRefresh " , typeof ( string ))] [System.Xml.Serialization.XmlElementAttribute( " Classes " , typeof (ClassesType))] [System.Xml.Serialization.XmlElementAttribute( " Code " , typeof ( string ))] [System.Xml.Serialization.XmlElementAttribute( " CodeModules " , typeof (CodeModulesType))] [System.Xml.Serialization.XmlElementAttribute( " ConsumeContainerWhitespace " , typeof ( bool ))] [System.Xml.Serialization.XmlElementAttribute( " CustomProperties " , typeof (CustomPropertiesType))] [System.Xml.Serialization.XmlElementAttribute( " DataElementName " , typeof ( string ))] [System.Xml.Serialization.XmlElementAttribute( " DataElementStyle " , typeof (ReportDataElementStyle))] [System.Xml.Serialization.XmlElementAttribute( " DataSchema " , typeof ( string ))] [System.Xml.Serialization.XmlElementAttribute( " DataSets " , typeof (DataSetsType))] [System.Xml.Serialization.XmlElementAttribute( " DataSources " , typeof (DataSourcesType))] [System.Xml.Serialization.XmlElementAttribute( " DataTransform " , typeof ( string ))] [System.Xml.Serialization.XmlElementAttribute( " DeferVariableEvaluation " , typeof ( bool ))] [System.Xml.Serialization.XmlElementAttribute( " Description " , typeof (StringLocIDType))] [System.Xml.Serialization.XmlElementAttribute( " EmbeddedImages " , typeof (EmbeddedImagesType))] [System.Xml.Serialization.XmlElementAttribute( " InitialPageName " , typeof ( string ))] [System.Xml.Serialization.XmlElementAttribute( " Language " , typeof ( string ))] [System.Xml.Serialization.XmlElementAttribute( " ReportParameters " , typeof (ReportParametersType))] [System.Xml.Serialization.XmlElementAttribute( " ReportSections " , typeof (ReportSectionsType))] [System.Xml.Serialization.XmlElementAttribute( " Variables " , typeof (VariablesType))] [System.Xml.Serialization.XmlChoiceIdentifierAttribute( " ItemsElementName " )] public object [] Items { get { return this .itemsField; } set { this .itemsField = value; } } /// <remarks/> [System.Xml.Serialization.XmlElementAttribute( " ItemsElementName " )] [System.Xml.Serialization.XmlIgnoreAttribute()] public ReportItemsElementNameType[] ItemsElementName { get { return this .itemsElementNameField; } set { this .itemsElementNameField = value; } } /// <remarks/> [System.Xml.Serialization.XmlAnyAttributeAttribute()] public System.Xml.XmlAttribute[] AnyAttr { get { return this .anyAttrField; } set { this .anyAttrField = value; } } }
Report类有XmlRootAttribute和XmlTypeAttribute这2个特性,而另一个类MapPolygonLayerType则只有XmlTypeAttribute
一个特性,如下所示:
代码
[System.CodeDom.Compiler.GeneratedCodeAttribute( " xsd " , " 2.0.50727.1432 " )] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute( " code " )] [System.Xml.Serialization.XmlTypeAttribute(Namespace = " http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition " )] public partial class MapPolygonLayerType : IMapPolygonLayerType { private object [] itemsField; private MapPolygonLayerTypeItemsElementNameType[] itemsElementNameField; private string nameField; private System.Xml.XmlAttribute[] anyAttrField; /// <remarks/> [System.Xml.Serialization.XmlAnyElementAttribute()] [System.Xml.Serialization.XmlElementAttribute( " DataElementName " , typeof ( string ))] [System.Xml.Serialization.XmlElementAttribute( " DataElementOutput " , typeof (MapPolygonLayerTypeDataElementOutput))] [System.Xml.Serialization.XmlElementAttribute( " MapBindingFieldPairs " , typeof (MapBindingFieldPairsType))] [System.Xml.Serialization.XmlElementAttribute( " MapCenterPointRules " , typeof (MapPointRulesType))] [System.Xml.Serialization.XmlElementAttribute( " MapDataRegionName " , typeof ( string ))] [System.Xml.Serialization.XmlElementAttribute( " MapFieldDefinitions " , typeof (MapFieldDefinitionsType))] [System.Xml.Serialization.XmlElementAttribute( " MapMarkerTemplate " , typeof (MapMarkerTemplateType))] [System.Xml.Serialization.XmlElementAttribute( " MapPolygonRules " , typeof (MapPolygonRulesType))] [System.Xml.Serialization.XmlElementAttribute( " MapPolygonTemplate " , typeof (MapPolygonTemplateType))] [System.Xml.Serialization.XmlElementAttribute( " MapPolygons " , typeof (MapPolygonsType))] [System.Xml.Serialization.XmlElementAttribute( " MapShapefile " , typeof (MapShapefileType))] [System.Xml.Serialization.XmlElementAttribute( " MapSpatialDataRegion " , typeof (MapSpatialDataRegionType))] [System.Xml.Serialization.XmlElementAttribute( " MapSpatialDataSet " , typeof (MapSpatialDataSetType))] [System.Xml.Serialization.XmlElementAttribute( " MaximumZoom " , typeof ( string ))] [System.Xml.Serialization.XmlElementAttribute( " MinimumZoom " , typeof ( string ))] [System.Xml.Serialization.XmlElementAttribute( " Transparency " , typeof ( string ))] [System.Xml.Serialization.XmlElementAttribute( " VisibilityMode " , typeof ( string ))] [System.Xml.Serialization.XmlChoiceIdentifierAttribute( " ItemsElementName " )] public object [] Items { get { return this .itemsField; } set { this .itemsField = value; } } /// <remarks/> [System.Xml.Serialization.XmlElementAttribute( " ItemsElementName " )] [System.Xml.Serialization.XmlIgnoreAttribute()] public MapPolygonLayerTypeItemsElementNameType[] ItemsElementName { get { return this .itemsElementNameField; } set { this .itemsElementNameField = value; } } /// <remarks/> [System.Xml.Serialization.XmlAttributeAttribute(DataType = " normalizedString " )] public string Name { get { return this .nameField; } set { this .nameField = value; } } /// <remarks/> [System.Xml.Serialization.XmlAnyAttributeAttribute()] public System.Xml.XmlAttribute[] AnyAttr { get { return this .anyAttrField; } set { this .anyAttrField = value; } } }
我们对其序列化和反序列化:
代码
string mapline = SimpleLoadXml( @" ..\..\..\MapLineRules.xml " ); Report ret2 = (Report)DeSerialize(Encoding.UTF8.GetBytes(mapline), typeof (Report)); string ret2str = SerializeToStr(ret2); string mapPolygonLayerstr = " <MapPolygonLayerType Name=\ " Name025c5c62b72241e79fc7f18b00978e4a\ " xmlns:xsi=\ " http: // www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\" http://www.w3.org/2001/XMLSchema \">" + " <MapCenterPointRules xmlns=\ " http: // schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition\">" + " <MapMarkerRule> " + " <MapMarkers> " + " <MapMarker /> " + " </MapMarkers> " + " </MapMarkerRule> " + " </MapCenterPointRules> " + " </MapPolygonLayerType> " ; object mapPolygonLayerobj = DeSerialize(mapPolygonLayerstr, typeof (MapPolygonLayerType)); string mapPolygonLayerstr2 = " <MapPolygonLayerType Name=\ " Name025c5c62b72241e79fc7f18b00978e4a\ " > " + " <MapCenterPointRules> " + " <MapMarkerRule> " + " <MapMarkers> " + " <MapMarker /> " + " </MapMarkers> " + " </MapMarkerRule> " + " </MapCenterPointRules> " + " </MapPolygonLayerType> " ; object mapPolygonLayerobj2 = DeSerialize(mapPolygonLayerstr2, typeof (MapPolygonLayerType));
ret2的结构为:
mapPolygonLayerobj的结构为:
mapPolygonLayerobj2的结构为:
可见mapPolygonLayerobj与ret2中的MapPolygonLayer结构一致,而mapPolygonLayerobj2的结构则不相同。
原因在于mapPolygonLayerstr比mapPolygonLayerstr2多了xmlns:xsi, xmlns:xsd,xmlns这3个属性(注意属性
所在的位置。
总上,XmlRootAttribute与XmlTypeAttribute差别不大。