BinaryFormatter
- это сериализованный тип; он глубоко внедряет метаданные типа в выход. Я бы сказал, что у вас есть скопировано определение класса между проектами - этого недостаточно для BinaryFormatter
, так как это уже не то же самое Type
(типы привязаны к их сборке).
В вашем сценарии мне кажется, что правильная вещь здесь должна заключаться в использовании договора ; например:
- XML (
XmlSerializer
, DataContractSerializer
и т.д.)
- JSon (
JavascriptSerializer
, JSON.net и т.д.)
- бинарный (Protobuf-сети и т.д.)
Там бы бы полностью в вашем сценарии, а также будет иметь гораздо лучший допуск к версии (BinaryFormatter
очень хрупкий с версиями)
Вы упомянули, что «XMLs здесь небезопасны, так как я не хочу, чтобы пользователи знали содержимое основного файла базы данных». - в этом случае 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
класс с 2-мя членами строки (большинство из код здесь просто сантехника, чтобы показать полный пример):
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);
}
}
}
}
проверка: [этот вопрос] (http://stackoverflow.com/questions/4193951/how-to-get-binaryformatter-to-deserialize-in-a-different- приложение) –