Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表属性的Xml序列化不';如果列表中有一个项目,则无法工作_C#_Xml - Fatal编程技术网

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; }
}