c# - 如何将多个对象序列化/反序列化为单个 XML 文件?
问题描述
注意:XML 序列化提前,意味着将生成 XML 文件。
问题是如何在 1 个 XML 文件中序列化/反序列化多个对象?
对于上下文,我在构建时尝试多对象序列化(减少到可读性):
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 是可取的。
另一方面,消毒结束:我还没有设法在我的另一堂课上一次全部消毒这些物品。
重申确切和具体的问题,我如何一次序列化/去消毒多个对象?
欢迎与此代码有关的所有建议,即使它不能完全回答我的问题。特别是,我确实认为“最好告诉我我需要知道什么,而不是我问什么”
解决方案
原则上,这可以通过几个小技巧来实现。
让我们看看如何做到这一点。
我们将保存的模型:
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
可以。
但是正如另一个答案中已经建议的那样,使用包装容器可能更容易。
推荐阅读
- javascript - 将 div 转换为图像 HTML 的最简单方法
- r - 使用调查包循环遍历列并根据条件打印比例或均值表
- r - 为什么 R 会有这样的行为?
- string - 从两个括号之间提取数字
- parsing - 使用 java 8 解析 LocalDateTime 的问题
- elasticsearch - Percolate query alternative for given use case
- ubuntu-14.04 - Python3.6 No module named '_curses'
- dbeaver - How do I enable or configure "Code Folding" and Side-by-Side Text Compare in DBeaver?
- python - 您可以在 TensorFlow/Keras 顺序网络中为多个输出设置目标吗
- kubernetes - K8S Fabric8 API + deploy、pod 和 service 一口气?