Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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#_.net_Wpf_Xml_Serialization - Fatal编程技术网

C# 列表上的XML序列化控制顺序

C# 列表上的XML序列化控制顺序,c#,.net,wpf,xml,serialization,C#,.net,Wpf,Xml,Serialization,我正在尝试将以下类序列化为XML: [XmlRoot("FCS_SET_SCH")] public class DDCSendReceiveScheduleXml { private const string TABLE_NAME = "DDCScheduler"; [XmlElement("schedule",Order=1)] public List<ScheduleXml> ScheduleList { get; set; } [XmlEle

我正在尝试将以下类序列化为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()
    {

    }
}
[XmlRoot(“FCS\u SET\u SCH”)]
公共类DDCSendReceiveScheduleXml
{
private const string TABLE_NAME=“DDCScheduler”;
[XmlElement(“附表”,订单=1)]
公共列表计划列表{get;set;}
[XmlElement(“时间表”,顺序=2)]
公共列表TimeTableXmlList{get;set;}
公共DDCSendReceiveScheduleXml()
{
}
}
如果我要序列化每个对象的一个对象,则Order标志可以工作,但它似乎无法控制列表上的顺序

这就是XmlSerializer目前序列化两个列表的方式:

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

...
...
...
...

表示相关的项,如
列表,如果您希望项配对。

表示相关的项,如
列表,如果您希望项配对。

您可以使用来获得有关序列化过程的更多控制。输入接口时,可以访问
GetObjectData
方法

// Implement this method to serialize data. The method is called  
// on serialization. 
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
    var smallest = (TimeTableXmlList.Count < ScheduleList.Count ?? TimeTableXmlList.Count : ScheduleList.Count )
    for(int x = 0; x < smallest; x++)
    {
        var time = TimeTableXmlList.ElementAt(x);
        var schedule = ScheduleList.ElementAt(x)
                // Use the AddValue method to specify serialized values.
        info.AddValue("timetable", time, typeof(TimeTableXml));
        info.AddValue("schedule", schedule , typeof(ScheduleXml));
    }
}
//实现此方法以序列化数据。方法被调用
//关于序列化。
public void GetObjectData(SerializationInfo信息、StreamingContext上下文)
{
变量最小=(TimeTableXmlList.Count
代码示例未经测试

您可以使用获得有关序列化过程的更多控制。输入接口时,可以访问
GetObjectData
方法

// Implement this method to serialize data. The method is called  
// on serialization. 
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
    var smallest = (TimeTableXmlList.Count < ScheduleList.Count ?? TimeTableXmlList.Count : ScheduleList.Count )
    for(int x = 0; x < smallest; x++)
    {
        var time = TimeTableXmlList.ElementAt(x);
        var schedule = ScheduleList.ElementAt(x)
                // Use the AddValue method to specify serialized values.
        info.AddValue("timetable", time, typeof(TimeTableXml));
        info.AddValue("schedule", schedule , typeof(ScheduleXml));
    }
}
//实现此方法以序列化数据。方法被调用
//关于序列化。
public void GetObjectData(SerializationInfo信息、StreamingContext上下文)
{
变量最小=(TimeTableXmlList.Count

代码示例未经测试

有了有用的答案和注释,我最终能够得到正确的解决方案。我在这里发布我所做的是为了帮助其他面临类似问题的人

如果首先使用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]);
        }
    }
[XmlRoot(“FCS\u SET\u SCH”)]
公共类DDCSendReceiveScheduleXml:IXmlSerializable
{
...
公共XmlSchema GetSchema()
{
返回null;
}
public void WriteXml(XmlWriter)
{
Assert(ScheduleList.Count==TimeTableXmlList.Count,“ScheduleList和TimeTableXml计数不一样”);
XmlSerializer scheduleSerializer=新的XmlSerializer(typeof(ScheduleXml));
XmlSerializer timeTableSerializer=新的XmlSerializer(typeof(TimeTableXml));
for(int i=0;i

这产生了我最初想要的结果。当然,这假设您已经将这两个类标记为Xml序列化。

有了有用的答案和注释,我最终能够得到正确的解决方案。我在这里发布我所做的是为了帮助其他面临类似问题的人

如果首先使用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]);
        }
    }
[XmlRoot(“FCS\u SET\u SCH”)]
公共类DDCSendReceiveScheduleXml:IXmlSerializable
{
...
公共XmlSchema GetSchema()
{
返回null;
}
public void WriteXml(XmlWriter)
{
Assert(ScheduleList.Count==TimeTableXmlList.Count,“ScheduleList和TimeTableXml计数不一样”);
XmlSerializer scheduleSerializer=新的XmlSerializer(typeof(ScheduleXml));
XmlSerializer timeTableSerializer=新的XmlSerializer(typeof(TimeTableXml));
for(int i=0;i

这产生了我最初想要的结果。当然,这假设您已经将这两个类标记为Xml序列化。

为什么?Xml中元素的顺序应该无关紧要,除非您使用的是非常严格的解析器。@DStanley正是如此。这是针对嵌入式设备上的解析器,它有自己荒谬的排序规则是XML的。为什么?XML中元素的顺序应该无关紧要,除非你使用的是一个非常严格的解析器。@DStanley准确地说。这是针对一个嵌入式设备上的解析器,它在XML的顺序上有自己荒谬的规则。哦,我喜欢这个想法。很高兴听到这个消息,但我不确定他的设备是否也这么认为^不完美,因为它只允许您使用较小的列表。他必须编辑它以适合自己的目的。当他使用此接口时,他还必须实现流程的其他部分!!!非常无能!这基本上就是我要找的。出于某种原因,它对我不起作用。我需要在正在使用的类上实现接口序列化的,对吗?它似乎没有进入通用电气