BinaryFormatter
является сериализованным на основе типа; он глубоко внедряет метаданные типа в вывод. Держу пари, что у вас есть скопированное определение класса между проектами - этого недостаточно для BinaryFormatter
, поскольку это уже не то же самое Type
(типы привязаны к их сборке ).
В вашем сценарии мне кажется, что правильной вещью здесь будет использование сериализатора на основе контракт ; например:
- xml (
XmlSerializer
, DataContractSerializer
и т. Д.)
- JSON (
JavascriptSerializer
, JSON.net и т. Д.)
- бинарный (protobuf-net и т. Д.)
В вашем сценарии будет полностью , а также будет гораздо лучший допуск на версию (BinaryFormatter
очень хрупок с версиями)
Вы упоминаете "XML здесь небезопасны, так как я не хочу, чтобы пользователи знали содержимое основного файла базы данных". - в этом случае «protobuf-net» имеет «преимущество» в том, что он не читается человеком, но учтите: ни один из них, ни BinaryFormatter
не являются зашифрованными ; если бы я хотел, я мог бы получить содержимое, если бы я действительно, очень хотел. Если вам нужна надежная защита, используйте правильное шифрование. В этом случае ваш код становится (помимо нескольких атрибутов маркера):
using(var stream = new FileStream("BinarySerialization.bin", FileMode.Create,
FileAccess.Write, FileShare.None))
{
Serializer.Serialize(stream, words);
}
Изменить, чтобы показать (по комментариям), как сериализовать Dictionary<string, List<Word>>
, где Word
- это класс с двумя строковыми членами (большая часть кода здесь просто используется для показа полного примера):
using System;
using System.Collections.Generic;
using System.IO;
using ProtoBuf;
[ProtoContract]
public class Word {
[ProtoMember(1)]
public string Foo { get; set; }
[ProtoMember(2)]
public string Bar { get; set; }
}
static class Program {
public static void Main() {
var data = new Dictionary<string, List<Word>>{
{"abc", new List<Word> {
new Word { Foo = "def", Bar = "ghi"},
new Word { Foo = "jkl", Bar = "mno"}
}},
{"pqr", new List<Word> {
new Word {Foo = "stu", Bar = "vwx"}
}}
};
using(var file = File.Create("my.bin")) {
Serializer.Serialize(file, data);
}
Dictionary<string, List<Word>> clone;
using(var file = File.OpenRead("my.bin")) {
clone = Serializer.Deserialize<
Dictionary<string, List<Word>>>(file);
}
foreach(var pair in clone) {
Console.WriteLine(pair.Key);
foreach(var word in pair.Value){
Console.WriteLine("\t{0} | {1}", word.Foo, word.Bar);
}
}
}
}