【问题标题】:How to serialize/deserialize several objects to a single XML file?如何将多个对象序列化/反序列化为单个 XML 文件?
【发布时间】:2021-05-03 22:33:31
【问题描述】:

注意:XML序列化提前,意味着将生成XML文件。

问题是如何在 1 个 XML 文件中序列化/反序列化多个对象

FOR CONTEXT 我在构建时尝试多对象序列化(减少到可读性):

public class platformData
  {

    public platformData()
    {
      public int this.platformId = platformIter;
    };
  }

static void Build(){
  //writer needs to be set-able
  if (File.Exists(Course01.xml))
  {
    File.Delete(Course01.xml);
  }
  StreamWriter writeToCourseFile = new StreamWriter("Course01.xml"); //<---file being made

  //think of -1 as null, and 0 to x as index numbers.
  for(int chapterIter = -1; chapterIter > chapterLimiter; ++chapterIter)
    {
      for(int missionIter = -1; missionIter > missionLimiter; ++missionIter)
      {
        //reroll mission template arrays using same settings
        private Random rnd = new Random();
        private int orderRnd = rnd.Next(0,4);
        private int activeOrderRef = (distanceSetting * 5) + orderRnd;
        public int[] activeOrderTemplate = orderTemplate[activeOrderRef];

        for(int platformIter = -1; platformIter > platformLimiter; ++platformIter)
          {
            private Random rnd = new Random();
            public int rndPos = rnd.Next(0,2);

            platformData Platform = new platformData();
            XmlSerializer platformSave = new XmlSerializer(object);//<--attempting to assign each object to serializer.
            platformSave.Serialize(writeToCourseFile, Platform);

          }

      }
    }
  writeToCourseFile.Close(); //<--done editing file

  };

在此,序列化结束:它看起来一团糟,因为我无法在迭代之外引用每个实例(因为它们具有相同的平台引用),我什至不相信“XmlSerializer platformSave = new XmlSerializer(object );"会拉出我刚刚制作的特定对象,我也不相信在对象构造期间打开 SreamWriter 是可取的。

另一方面,消毒结束:我还没有设法在我的其他班级一次全部消毒这些物品。

重申确切和具体的问题,我如何一次序列化/去毒化多个对象?

欢迎与此代码有关的所有建议,即使它不能完全回答我的问题。特别是,我确实认为“最好告诉我我需要知道什么,而不是我问什么”

【问题讨论】:

  • 这里有一个建议:发布相关的 XML
  • 此代码将生成 XML 文件(通过序列化),但此代码未处于功能状态。代码将是 build 方法生成的所有对象。
  • 好吧,老实说,你应该编辑你的问题,因为它不是很清楚。
  • 我在代码中添加了一些 cmets,老实说我不知道​​我还能做什么......问题是关于 xml 序列化,这意味着我正在从我的代码中生成一些 xml.. .
  • 看,我粘贴了你的代码,添加了相关的用法,但最终出现了 41 个错误......除非你发布一个最小的、可验证的和完整的示例 (stackoverflow.com/help/minimal-reproducible-example),否则没有人会费心寻找在它。

标签: c# serialization deserialization xml-serialization


【解决方案1】:

原则上,这可以通过几个小技巧来实现。
让我们看看如何做到这一点。

我们要保存的模型:

public class PlatformData
{
    public int PlatformId { get; set; }
    // other properties
}

序列化:

var xs = new XmlSerializer(typeof(PlatformData));

var settings = new XmlWriterSettings { OmitXmlDeclaration = true, Indent = true };
using (var writer = XmlWriter.Create("Course01.xml", settings))
{
    writer.WriteStartElement("Root");
    for (int i = 0; i < 5; i++)
    {
        var platform = new PlatformData { PlatformId = i };
        xs.Serialize(writer, platform);
    }
}

诀窍是我们需要手动添加一个包含我们的对象的元素。
WriteStartElement 做到了。


反序列化:

var platforms = new List<PlatformData>();
using (var reader = XmlReader.Create("Course01.xml"))
{
    reader.ReadToFollowing("PlatformData");
    for (int i = 0; i < 5; i++)
    {
        var platform = (PlatformData)xs.Deserialize(reader);
        platforms.Add(platform);
    }
}

这里的诀窍是我们必须手动跳过之前添加的项目。
ReadToFollowing 会这样做。


但正如另一个答案中已经建议的那样,使用包装容器可能更容易。

【讨论】:

  • 我实际上使用了这个解决方案,因为它与我的数据转换很好地集成在一起,它在行为上是耦合的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
相关资源
最近更新 更多