В C # Как я могу сериализовать очередь <>? (.Net 2.0) - PullRequest
8 голосов
/ 21 ноября 2008

В строке конструктора 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 ]

14 голосов
/ 21 ноября 2008

Было бы проще (и более подходящим IMO) сериализовать данные из очереди - возможно, в виде плоского массива или List<T>. Поскольку Queue<T> реализует IEnumerable<T>, вы можете использовать:

List<T> list = new List<T>(queue);
1 голос
/ 22 ноября 2008

Не все части инфраструктуры предназначены для сериализации XML. Вы обнаружите, что в отделе сериализации также отсутствуют словари.

Очередь довольно проста в реализации. Вы можете легко создать свой собственный, который также реализует IList, так что он будет сериализуем.

0 голосов
/ 04 февраля 2019

В моем случае у меня была динамическая очередь, и я должен был сохранить и загрузить ее состояние.

Использование 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"));
0 голосов
/ 22 ноября 2008

Если вы хотите использовать встроенную сериализацию, вам нужно играть по ее правилам, что означает ctor по умолчанию и общедоступные свойства get / set для членов, которые вы хотите сериализовать (и предположительно десериализовать) на тип данных, который вы хотите сериализовать (MyData)

...