1

次のクラスを XML にシリアル化しようとしています。

[XmlRoot("FCS_SET_SCH")]
public class DDCSendReceiveScheduleXml
{
    private const string TABLE_NAME = "DDCScheduler";

    [XmlElement("schedule",Order=1)]
    public List<ScheduleXml> ScheduleList { get; set; }

    [XmlElement("timetable",Order=2)]
    public List<TimeTableXml> TimeTableXmlList { get; set; }

    public DDCSendReceiveScheduleXml()
    {

    }
}

単一のオブジェクトをそれぞれシリアル化する場合、順序フラグは機能しますが、リストの順序を制御していないようです。

これは、現時点で XmlSerializer が 2 つのリストをシリアル化する方法です。

<FCS_SET_SCH xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <schedule>...</schedule>
   <schedule>...</schedule>
   <timetable>...</timetable>
   <timetable>...</timetable>
</FCS_SET_SCH>

上記がこの順序になるようにシリアル化を制御する方法はありますか?

<FCS_SET_SCH xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <schedule>...</schedule>
   <timetable>...</timetable>
   <schedule>...</schedule>
   <timetable>...</timetable>
</FCS_SET_SCH>
4

3 に答える 3

0

役立つ回答とコメントにより、最終的に正しい解決策を得ることができました. 同様の問題に直面している他の人を助けるために、私が行ったことをここに投稿します。

これを行う簡単で適切な方法は、最初に XmlSerializer を使用している場合、IXmlSerializable を実装することです。

[XmlRoot("FCS_SET_SCH")]
public class DDCSendReceiveScheduleXml : IXmlSerializable
{
     ...
    public XmlSchema GetSchema()
    {
        return null;
    }

    public void WriteXml(XmlWriter writer)
    {
        Debug.Assert(ScheduleList.Count == TimeTableXmlList.Count, "ScheduleList and TimeTableXml Count isn't same");
        XmlSerializer scheduleSerializer = new XmlSerializer(typeof(ScheduleXml));
        XmlSerializer timeTableSerializer = new XmlSerializer(typeof(TimeTableXml));
        for (int i = 0; i < ScheduleList.Count; i++)
        {
            scheduleSerializer.Serialize(writer, ScheduleList[i]);
            timeTableSerializer.Serialize(writer, TimeTableXmlList[i]);
        }
    }

これにより、最初に望んでいた結果が得られます。もちろん、これは、2 つのクラスが既に Xml シリアル化用にマークされていることを前提としています。

于 2013-08-27T14:55:46.240 に答える