C# 列表属性的Xml序列化不';如果列表中有一个项目,则无法工作
尝试将以下内容用于类及其属性:C# 列表属性的Xml序列化不';如果列表中有一个项目,则无法工作,c#,xml,C#,Xml,尝试将以下内容用于类及其属性: public class TotalRecords { public Recs recs { get; set; } public string ItineraryCount { get; set; } } public partial class Recs { public string amountField { get; set; } public string travelTimeField { get
public class TotalRecords
{
public Recs recs { get; set; }
public string ItineraryCount { get; set; }
}
public partial class Recs
{
public string amountField { get; set; }
public string travelTimeField { get; set; }
public FSegment fSegmentField { get; set; }
public string itineraryNumberField { get; set; }
}
public class FSegment
{
public List<Segment> OutProperty {get;set;}
}
public class Segment
{
public string nameField { get; set; }
public string cityField { get; set; }
public string countryField { get; set; }
}
这样的黑客攻击在许多情况下都会有所帮助,也许在您的应用程序中也是如此(将列表
转换为数组):
公共类FSegment
{
[XmlIgnore]
公共列表输出属性{get;set;}
[XmlArray(“输出属性”);
公共段[]\u输出属性
{
获取{return OutProperty.ToArray();}
设置{OutProperty=新列表(值);}
}
}
我不能确切地确定您提供的类定义以前在没有任何XML属性/元素定义的情况下是如何工作的,因为您的变量名与XML标识符不同,这意味着序列化不会填充它找不到名称的属性
尽管如此,这里的主要问题是您试图将列表放入普通属性中。从提供的XML中,
OutProperty
是FSegment
的单个子元素,Segment
是OutProperty
的子元素数组,但在提供的代码中,您试图使Segment
成为FSegment
的数组子元素
类定义的正确结构应如下所示(还包括XML定义)
[System.Xml.Serialization.XmlRoot(ElementName=“TotalRecords”)]
公共类总记录
{
[System.Xml.Serialization.xmlement(ElementName=“Recs”)]
公共记录记录{get;set;}
[System.Xml.Serialization.XmlAttribute(AttributeName=“巡回计数”)]
公共字符串巡回计数{get;set;}
}
公共部分类REC
{
[System.Xml.Serialization.xmlement(ElementName=“Amount”)]
公共字符串数量字段{get;set;}
[System.Xml.Serialization.XmlElement(ElementName=“TravelTime”)]
公共字符串travelTimeField{get;set;}
[System.Xml.Serialization.xmlement(ElementName=“FSegment”)]
公共FSegment fSegmentField{get;set;}
[System.Xml.Serialization.XmlAttribute(AttributeName=“行程编号”)]
公共字符串巡回编号字段{get;set;}
}
公营部门
{
[System.Xml.Serialization.xmlement(ElementName=“OutProperty”)]
公共段列表输出属性{get;set;}
}
公共类分段列表
{
[System.Xml.Serialization.xmlement(ElementName=“段”)]
公共列表段字段{get;set;}
}
公共课部分
{
[System.Xml.Serialization.xmlement(ElementName=“Name”)]
公共字符串名称字段{get;set;}
[System.Xml.Serialization.xmlement(ElementName=“City”)]
公共字符串cityField{get;set;}
[System.Xml.Serialization.xmlement(ElementName=“Country”)]
公共字符串countryField{get;set;}
[System.Xml.Serialization.XmlAttribute(AttributeName=“否”)]
public int segmentNoField{get;set;}
}
请注意,在上述结构中,Segment
是OutProperty
对象下的列表对象,它位于FSegment
对象下
使用此类结构加载XML会在创建的对象中生成(假定)正确的数据
通过使用XML定义,您可以将类属性的实际名称与XML数据中调用的名称分离。这允许您更改其中一个而不影响另一个,这在您不控制XML数据的创建时非常有用。如果您不希望代码中包含所有XML定义,请更改类的名称,以便您可以将属性的名称与XML文件中的名称相同。这将允许您将所有内容直接耦合到列表属性中-这是否会产生错误?错误是什么?感谢Brend Linde不,它不会产生任何错误,但如果outproperty中只有一个段,则列表的计数为0。带属性的实际代码可能有助于查看某些内容。您的
XmlArray
属性缺少一个方括号(])。
public class TotalRecords
{
public Recs recs { get; set; }
public string ItineraryCount { get; set; }
}
public partial class Recs
{
public string amountField { get; set; }
public string travelTimeField { get; set; }
public FSegment fSegmentField { get; set; }
public string itineraryNumberField { get; set; }
}
public class FSegment
{
public List<Segment> OutProperty {get;set;}
}
public class Segment
{
public string nameField { get; set; }
public string cityField { get; set; }
public string countryField { get; set; }
}
[DataContract]
public class Contact
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
}
public class FSegment
{
[XmlIgnore]
public List<Segment> OutProperty {get;set;}
[XmlArray("OutProperty");
public Segment[] _OutProperty
{
get { return OutProperty.ToArray(); }
set { OutProperty = new List<Segment>(value); }
}
}
[System.Xml.Serialization.XmlRoot(ElementName="TotalRecords")]
public class TotalRecords
{
[System.Xml.Serialization.XmlElement(ElementName="Recs")]
public Recs recs { get; set; }
[System.Xml.Serialization.XmlAttribute(AttributeName = "ItineraryCount")]
public string ItineraryCount { get; set; }
}
public partial class Recs
{
[System.Xml.Serialization.XmlElement(ElementName = "Amount")]
public string amountField { get; set; }
[System.Xml.Serialization.XmlElement(ElementName = "TravelTime")]
public string travelTimeField { get; set; }
[System.Xml.Serialization.XmlElement(ElementName = "FSegment")]
public FSegment fSegmentField { get; set; }
[System.Xml.Serialization.XmlAttribute(AttributeName = "ItineraryNumber")]
public string itineraryNumberField { get; set; }
}
public class FSegment
{
[System.Xml.Serialization.XmlElement(ElementName = "OutProperty")]
public SegmentList OutProperty { get; set; }
}
public class SegmentList
{
[System.Xml.Serialization.XmlElement(ElementName = "Segment")]
public List<Segment> segmentField { get; set; }
}
public class Segment
{
[System.Xml.Serialization.XmlElement(ElementName = "Name")]
public string nameField { get; set; }
[System.Xml.Serialization.XmlElement(ElementName = "City")]
public string cityField { get; set; }
[System.Xml.Serialization.XmlElement(ElementName = "Country")]
public string countryField { get; set; }
[System.Xml.Serialization.XmlAttribute(AttributeName = "No")]
public int segmentNoField { get; set; }
}