BinaryFormatter
は、タイプベースのシリアライズされたものです。タイプメタデータを出力に深く埋め込みます。それはもはや同じType
あるので、それは、BinaryFormatter
のために十分ではないではありません(種類はそのアセンブリにバインドされている) - 私はあなたがは、プロジェクト間クラス定義をコピーしたことを賭けるだろう。
あなたのシナリオでは、ここで正しいことは契約ベースのシリアライザを使用することです。例えば:
- XML(
XmlSerializer
、DataContractSerializer
、など)
- JSON(
JavascriptSerializer
、JSON.net、など)
- バイナリ(いるProtobufネットなど)
だろうが、そこだろうあなたのシナリオでは全部となり、より良いバージョンの許容差があります(BinaryFormatter
はバージョンと非常に脆いです)
あなたは「ここではXMLは安全ではありません。ユーザがメインのデータベースファイルの内容を知りたくないからです。」 - その場合、protobuf-netは人間が判読できないという "利点"を持っていますが、これらのどれも、BinaryFormatter
はです。です。私がしたい場合は、私は本当に、本当にしたい場合は内容を取得することができます。強力なセキュリティが必要な場合は、適切な暗号化を使用してください。その場合、あなたのコードは(多分いくつかのマーカーの属性に加えて)次のようになります。
using(var stream = new FileStream("BinarySerialization.bin", FileMode.Create,
FileAccess.Write, FileShare.None))
{
Serializer.Serialize(stream, words);
}
編集(コメントごとに)表示するWord
は、2列のメンバーを持つクラスです(ほとんどのDictionary<string, List<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);
}
}
}
}
チェック:[この質問](http://stackoverflow.com/questions/4193951/how-to-get-binaryformatter-to-deserialize-in-a-different-次の記事を参照してください。アプリケーション) –