![](/img/trans.png)
[英]How to serialize different objects to the same XML file and then deserialize
[英]How to serialize/deserialize several objects to a single XML file?
注意: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);” 將取出我剛剛制作的特定 object,我也不相信在 object 構建期間打開 SreamWriter 是可取的。
另一方面,消毒結束:我還沒有設法在我的其他 class 中一次全部消毒這些物體。
重申確切和具體的問題,我如何一次序列化/去消毒多個對象?
歡迎與此代碼有關的所有建議,即使它不能完全回答我的問題。 特別是,我確實認為“最好告訴我我需要知道什么,而不是我問什么”
原則上,這可以通過幾個小技巧來實現。
讓我們看看如何做到這一點。
我們將保存的 model:
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
做到了。
但是正如另一個答案中已經建議的那樣,使用包裝容器可能更容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.