1

Я пытаюсь сериализовать Dictionary<int, int> как Dictionary<string, string>.Последовательный тип как Словарь

Так я создал Test2 тип из Dictionary<int, int> следующим образом:

[Serializable] 
    internal sealed class Test2 : Dictionary<int, int> 
    { 
     internal Test2() 
     { 
     } 

     private Test2(SerializationInfo info, StreamingContext context) 
     { 
      var data = (Dictionary<string, string>) 
         info.GetValue("data", typeof(Dictionary<string, string>)); 
      foreach (var item in data) 
       Add(int.Parse(item.Key), int.Parse(item.Value)); 
     } 

     public override void GetObjectData(SerializationInfo info, StreamingContext context) 
     { 
      var data = new Dictionary<string, string>(); 
      foreach (var item in this) 
       data[item.Key.ToString()] = item.Value.ToString(); 
      info.AddValue("data", data, typeof(Dictionary<string, string>)); 
     } 
    } 

и использовать следующий код для проверки сериализации:

 var test2 = new Test2 {{10, 10}}; 
     var formatter = new BinaryFormatter(); 
     using (var stream = new MemoryStream()) 
     { 
      formatter.Serialize(stream, test2); 
      stream.Position = 0; 
      var clone = (Test2) formatter.Deserialize(stream); 
     } 

По какой-то причине клон не содержит каких-либо данных, (Count eq до 0).

Update:

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

Я могу использовать только возможности .NET framework.

+2

Ваша первая проблема заключается в следующем: «Я пытаюсь сериализации словарь в словарь <строка, строка>». Зачем вам это делать? –

+0

Вы вызываете, что ваш частный конструктор называется? Возможно, вы могли бы попытаться сделать его общедоступным, как в этом примере: http://msdn.microsoft.com/en-us/library/ms182315%28v=vs.80%29.aspx –

+0

@Chris Shain: У меня есть две коллекции с большие объекты и один сборник, содержащий ссылки между ними (как ссылки на такие объекты). И я хочу сериализовать сборку ссылок, но использовать идентификаторы объектов вместо объектов. –

ответ

0

Вам не нужно преобразовывать целые числа в строки во время сериализации или определять свой собственный сериализуемый класс - структура заботится об этом для вас. Этот код (редактировалось this question) будет делать то, что вы хотите просто отлично:

var test2 = new Dictionary<int, int> { { 10, 10 } } ; 
var formatter = new BinaryFormatter(); 
using (MemoryStream stream = new MemoryStream()) 
{ 
    formatter.Serialize(stream, test2); 
    stream.Position = 0; 
    var clone = (Dictionary<int, int>) formatter.Deserialize(stream); 
} 

Я неопределенный, почему исходный код не работает, но я думаю, что это что-то делать с коллекцией SerializationInfo будучи не в состоянии сериализовать/десериализовать словари правильно. Я заменил свой класс с этим кодом, который использует List<Tuple<string,string>> вместо Dictionary<string,string> и она отлично работает:

[Serializable] 
internal sealed class Test2 : Dictionary<int, int> 
{ 
    internal Test2() 
    { 
    } 

    private Test2(SerializationInfo info, StreamingContext context) 
    { 
     var data = (List<Tuple<string, string>>) 
        info.GetValue("data", typeof(List<Tuple<string, string>>)); 
     foreach (var item in data) 
      Add(int.Parse(item.Item1), int.Parse(item.Item2)); 
    } 

    public override void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     var data = new List<Tuple<string, string>>(); 
     foreach (var item in this) 
      data.Add(Tuple.Create(item.Key.ToString(), item.Value.ToString())); 
     info.AddValue("data", data, typeof(List<Tuple<string, string>>)); 
    } 
} 
+0

Спасибо, Деррик. Объяснение этого вопроса я обновил. В кадре - я хочу написать первичные ключи сохраненных объектов и восстановить их, заменив PK на реальные объекты. Что касается Tuple - я не могу его использовать, потому что я должен использовать .NET 2.0, но попытаюсь использовать KeyValuePair вместо Tuple. –

+0

Спасибо. Замена словаря с помощью List > делает код работающим. –

Смежные вопросы