Сериализация IDictionary в другом сериализуемом классе - PullRequest
1 голос
/ 11 февраля 2011

У нас есть класс, который мы пытаемся сериализовать, который содержит словарь.

У меня есть работоспособный код, реализующий IXmlSerializable для сериализации словарей, но я немного растерялся из-за того, как сериализовать объект, используя XMLSerializer по умолчанию, а затем, когда он достигает элемента словаря, вынудить его использовать созданный пользователем сериализатор.

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

Ниже приведен сокращенный пример класса, который я пытаюсь сериализовать, фактический объект намного больше;

public class Report 
{
    public int ID { get; set; }
    public string Name { get; set; }

    //...

    private Dictionary<string, string> _parameters = new Dictionary<string, string>();

}

Любая рекомендация относительно простого подхода к этому будет принята.

Ответы [ 2 ]

1 голос
/ 11 февраля 2011

К сожалению, IXmlSerializable - дело "все или ничего".Чтобы сделать что-нибудь самостоятельно, вы должны сделать все для этого типа, что не идеально.

Чтобы сделать его сложнее, процессор не можетобрабатывать многое с помощью обобщений, что затрудняет использование инкапсуляции некоторого типа, которым вы управляете, в качестве обходного пути.

0 голосов
/ 14 февраля 2011

Первоначальный вопрос возник, когда я пытался найти работоспособное решение для XML-сериализации словарей (в частности, для других объектов).

Тем временем я нашел альтернативный вариант, используя WCF DataContractSerializer, который имеет возможность сериализации словарей. Простейший пример что-то вроде:

using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;

namespace CodeSample
{
class Report                        
{
   public int ID { get; set; }
   public string Name { get; set; }
   //...                                                  
   private Dictionary<string, string> _parameters = new Dictionary<string, string>();

   public Dictionary<string, string> Parameters {
       get { return _parameters; }
       set { _parameters = value; }       
   }
}


class StartUp
{
   static void Main()
   {
    System.IO.Stream fStream = new FileStream("C:\\Out.xml" , FileMode.Create);
    Report x = new Report();
    Report y;
    System.IO.Stream rStream;

    // Presuming that Parameters is an exposed reference to the dictionary
    x.Parameters.Add("Param1", "James2");
    x.Parameters.Add("Param2", System.DateTime.Now.ToString());
    x.Parameters.Add("Param3", 2.4.ToString());

    DataContractSerializer dcs = new DataContractSerializer(x.GetType());

    dcs.WriteObject(fStream, x);

    fStream.Flush();
    fStream.Close();

    rStream = new FileStream("C:\\Out.xml", FileMode.Open);

    y = (Report) dcs.ReadObject(rStream);
    //y is now a copy of x
   }
}

}

Не уверен, есть ли какие-либо непредвиденные недостатки.

...