如何序列化包含 XML 队列的类
本文关键字:队列 XML 包含 序列化 | 更新日期: 2023-09-27 18:31:47
我有一个名为GamePrototype的类,我想序列化它以供XML使用,其中包含以下成员:
public class GamePrototype
{
private string mPath;
private bool[] isHumanPlayer;
private Queue<CardPrototype> mKickStack;
private Queue<CardPrototype> mMainDeck;
private Queue<CardPrototype> mStarterDecks;
private Queue<CardPrototype> mSuperVillianStack;
private Queue<CardPrototype> mWeaknessStack;
private Queue<PlayerHero> mPlayableHeroes;
public Queue<CardPrototype>[] mStartingLocations;
}
我一直在尝试使用此方法序列化类数据。"this"是指上述类的一个实例:
public void XMLShelf(string path)
{
XmlSerializer boxPacker = new XmlSerializer(typeof(GamePrototype));
StreamWriter boxPlacer = new StreamWriter(path);
boxPacker.Serialize(boxPlacer, this);
boxPlacer.Close();
}
我有大多数(如果不是全部)的 getter 和 setter,但我遇到了两个我不知道如何避免的错误:
Exception:Thrown: "You must implement a default accessor on
System.Collections.Generic.Queue`1[[Cards.GameBuilding.CardPrototype, Cards,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] because it inherits from
ICollection."...
和
Exception:Thrown: "There was an error reflecting type
'Cards.GameBuilding.GamePrototype'." (System.InvalidOperationException)
我在其他帖子中读到,在当前情况下,由于队列,这个类是不可序列化的。这些信息可能已经过时了?我不确定,但我的问题是:
有没有办法轻松地将这些队列传输到列表中以进行序列化? 我是否需要对这些成员所属的所有类执行此操作?例如,卡片原型包含一个队列和一个堆栈。
非常感谢您给我的任何帮助。
这取决于您使用的序列化。使用ISerializedable,它工作得很好。
[Serializable]
class Program : ISerializable
{
public Program() { }
public Queue<int> Queue = new Queue<int>();
private unsafe static void Main(string[] args)
{
var pr = new Program();
pr.Queue.Enqueue(1034);
using (var stream = File.Create("path.txt"))
{
var bformatter = new BinaryFormatter();
bformatter.Serialize(stream, pr);
}
using (var stream = File.Open("path.txt", FileMode.Open))
{
var bformatter = new BinaryFormatter();
pr = (Program)bformatter.Deserialize(stream);
}
Console.WriteLine("program " + pr.Queue.Peek()); //prints 1034
Console.Read();
}
public Program(SerializationInfo info, StreamingContext ctxt)
{
Queue = (Queue<int>)info.GetValue("queue", typeof(Queue<int>));
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("queue", Queue);
}
}
希望这有帮助。
必须实现队列的默认访问器,因为 XMLSerializer 需要它来枚举项,以及 Add 方法。
[Serializable]
public class SerializableQueue : Queue<MyObject>
{
public MyObject this[int index]
{
get
{
int count = 0;
foreach (MyObject o in this)
{
if (count == index)
return o;
count++;
}
return null;
}
}
public void Add(MyObject r)
{
Enqueue(r);
}
}
这是一个可以序列化为 XML 的队列。