在C#中,我如何序列化Queue<>?(.Net 2.0)

8
在XmlSerializer构造函数行中,下面的代码会引发InvalidOperationException异常,该异常还抱怨为泛型类型实现默认访问器。
Queue<MyData> myDataQueue = new Queue<MyData>();

// Populate the queue here


XmlSerializer mySerializer =
  new XmlSerializer(myDataQueue.GetType());    

StreamWriter myWriter = new StreamWriter("myData.xml");
mySerializer.Serialize(myWriter, myDataQueue);
myWriter.Close();
4个回答

15

我认为更加简单易行(而且也更为合适)的方法是将队列中的数据序列化,可以采用一维数组或者List<T>。由于Queue<T>实现了IEnumerable<T>接口,你应该可以使用以下代码:

List<T> list = new List<T>(queue);

1
你也可以使用 queue.ToList()。 - chakrit
我想了解您所提到的“更合适”的评论的详细信息。 - CrashCodes
@chakrit - 只有在 .NET 3.5 中才可以,但是可以。 - Marc Gravell
2
如果您序列化包含Queue<T>的类,这并不真正有帮助...除非您愿意XmlIgnore Queue并确保有一个List<T>字段保存数据的副本...或者有更好的方法吗? - Roman Starkov

1

并非框架的所有部分都设计用于XML序列化。您会发现字典在序列化方面也存在缺陷。

队列的实现相当简单。您可以轻松创建自己的队列,同时实现IList接口,以便它可以进行序列化。


0

如果你想使用内置的序列化功能,那就得按照它的规则来,也就是需要默认构造函数,并且为要序列化(以及可能反序列化)的成员提供公有的get/set属性, 而且需要针对你想序列化的数据类型(MyData)进行操作。


0
在我的情况下,我有一个动态队列,我需要保存和加载它的状态。
使用Newtonsoft.Json:
List<dynamic> sampleListOfRecords = new List<dynamic>();
Queue<dynamic> recordQueue = new Queue<dynamic>();
//I add data to queue from a sample list
foreach(dynamic r in sampleListOfRecords)
{
     recordQueue.Enqueue(r);
}

//Serialize
File.WriteAllText("queue.json",
     JsonConvert.SerializeObject(recordQueue.ToList(), Formatting.Indented));
//Deserialize
List<dynamic> data = 
     JsonConvert.DeserializeObject<List<dynamic>>(File.ReadAllText("queue.json"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接