【发布时间】:2016-03-26 22:04:16
【问题描述】:
我在 c# ASP.NET 环境中工作。我正在尝试将以下 XML 元素反序列化为 c# 对象/类。元素深度为 3 级。
<Availability>
<RecommendedSegment>
<Duration>1720</Duration>
<FareBasis>Y77OW</FareBasis>
<FlightSegment>
<DepDate>11 August</DepDate>
<DepTime>0830</DepTime>
<ArrDate>11 August</ArrDate>
<ArrTime>1110</ArrTime>
<DepDay>Mon</DepDay>
<ArrDay>Mon</ArrDay>
<DepAirport>LHR</DepAirport>
<DepAirportName>Heathrow</DepAirportName>
<DepCityName>London</DepCityName>
<ArrAirport>FRA</ArrAirport>
<ArrAirportName>Frankfurt Int'l</ArrAirportName>
<ArrCityName>Frankfurt</ArrCityName>
<DepCountry>United Kingdom</DepCountry>
<ArrCountry>Germany</ArrCountry>
<Airline>LH</Airline>
<AirName>Lufthansa</AirName>
<FlightNo>925</FlightNo>
<BookingClass>Y</BookingClass>
<AirCraftType>32A</AirCraftType>
<ETicket>Y</ETicket>
<NonStop>0</NonStop>
<DepTer>1</DepTer>
<ArrTer>1</ArrTer>
<AdtFareBasis>Y77OW</AdtFareBasis>
<ChdFareBasis>
</ChdFareBasis>
<InfFareBasis>
</InfFareBasis>
</FlightSegment>
<FlightSegment>
<DepDate>11 August</DepDate>
<DepTime>1330</DepTime>
<ArrDate>12 August</ArrDate>
<ArrTime>0100</ArrTime>
<DepDay>Mon</DepDay>
<ArrDay>Tue</ArrDay>
<DepAirport>FRA</DepAirport>
<DepAirportName>Frankfurt Int'l</DepAirportName>
<DepCityName>Frankfurt</DepCityName>
<ArrAirport>BOM</ArrAirport>
<ArrAirportName>Bombay</ArrAirportName>
<ArrCityName>Mumbai</ArrCityName>
<DepCountry>Germany</DepCountry>
<ArrCountry>India</ArrCountry>
<Airline>LH</Airline>
<AirName>Lufthansa</AirName>
<FlightNo>756</FlightNo>
<BookingClass>Y</BookingClass>
<AirCraftType>744</AirCraftType>
<ETicket>Y</ETicket>
<NonStop>0</NonStop>
<DepTer>1</DepTer>
<ArrTer>2</ArrTer>
<AdtFareBasis>Y77OW</AdtFareBasis>
<ChdFareBasis>
</ChdFareBasis>
<InfFareBasis>
</InfFareBasis>
</FlightSegment>
<FlightSegment>
<DepDate>12 August</DepDate>
<DepTime>0515</DepTime>
<ArrDate>12 August</ArrDate>
<ArrTime>0620</ArrTime>
<DepDay>Tue</DepDay>
<ArrDay>Tue</ArrDay>
<DepAirport>BOM</DepAirport>
<DepAirportName>Bombay</DepAirportName>
<DepCityName>Mumbai</DepCityName>
<ArrAirport>GOI</ArrAirport>
<ArrAirportName>Dabolim</ArrAirportName>
<ArrCityName>Goa</ArrCityName>
<DepCountry>India</DepCountry>
<ArrCountry>India</ArrCountry>
<Airline>AI</Airline>
<AirName>Air India</AirName>
<FlightNo>984</FlightNo>
<BookingClass>Y</BookingClass>
<AirCraftType>321</AirCraftType>
<ETicket>Y</ETicket>
<NonStop>0</NonStop>
<DepTer>2</DepTer>
<ArrTer>
</ArrTer>
<AdtFareBasis>Y</AdtFareBasis>
<ChdFareBasis>
</ChdFareBasis>
<InfFareBasis>
</InfFareBasis>
</FlightSegment>
<DepAirport>LHR</DepAirport>
<DepCity>LON</DepCity>
<DepCountry>GB</DepCountry>
<DepZone>1</DepZone>
<ArrAirport>GOI</ArrAirport>
<ArrCity>GOI</ArrCity>
<ArrCountry>IN</ArrCountry>
<ArrZone>5</ArrZone>
</RecommendedSegment>
</Availability>
我正在尝试捕获以下对象中的数据,该对象也是 3 级深;
[DataContract(Name = "Availability")]
public class Availability
{
[DataMember(Name = "RecommendedSegment", Order = 0)]
public RecommendedSegment RecommendedSegment;
[DataMember(Name = "RecommendedSegment", Order = 1)]
public RecommendedSegmentFlights RecommendedSegmentFlights;
}
当我运行代码时,出现以下异常;
"ExceptionMessage":"Type 'Availability' contains two members 'RecommendedSegment' 'and 'RecommendedSegmentFlights' with the same data member name 'RecommendedSegment'. Multiple members with the same name in one type are not supported. Consider changing one of the member names using DataMemberAttribute attribute."
我了解到使用 DataContract 不起作用。有没有办法将“FlightSegment”元素作为列表捕获到 RecommendedSegmentFlights 中?我已阅读我需要使用以下任一方法来覆盖默认的序列化行为
[OnDeserialized]
void OnDeserialized(StreamingContext c)
{
if (MyCustonObj == null)
{
MyCustonObj = new MyCustomClass();
MyCustonObj.MyStrData = "Overridden in serialization";
}
}
[OnDeserializing]
void OnDeserializing(StreamingContext c)
{
if (MyCustonObj == null)
{
MyCustonObj = new MyCustomClass();
MyCustonObj.MyStrData = "Overridden in deserializing";
}
}
[OnSerialized]
void OnSerialized(StreamingContext c)
{
// if you wan to do somehing when serialized here or just remove them
}
[OnSerializing]
void OnSerializing(StreamingContext c)
{
// if you wan to do somehing during serializing here or just remove them
}
我该怎么做?我想要的只是类中的属性 RecommendedSegmentFlights 以包含 FlightSegment 元素的列表。我也不介意它是否是RecommendedSegment 的孩子。对于 RecommendedSegmentFlights 属性,我有这个;
public class RecommendedSegmentFlights : List<FlightSegmentStructure> { }
谢谢。
【问题讨论】:
-
必须你使用
DataContractSerializer?不像XmlSerializer,它是does not allow a list to be serialized without the outer container element。 -
@user5500750,我们希望您的问题已得到解决。我可以建议您进一步阅读meta.stackexchange.com/questions/5234/…...问候...
-
有使用 DataContracts 的解决方案吗?蒙蒂的回答似乎有效,但我在从字符串反序列化 XML 时遇到问题。
-
@user5500750 查看我反序列化 XML 字符串的新答案.....
标签: c# asp.net asp.net-mvc datacontractserializer datacontract