public void Execute() { // // 普通のシリアライズ処理. // var obj = MakeSerializableObject(); using (var stream = new MemoryStream()) { var formatter = new BinaryFormatter(); // 成功する. formatter.Serialize(stream, obj); stream.Position = 0; Output.WriteLine(formatter.Deserialize(stream)); } // // シリアライズ不可 (Serializable属性をつけていない) // var obj2 = MakeNotSerializableObject(); using (var stream = new MemoryStream()) { var formatter = new BinaryFormatter(); try { // 対象クラスにSerializable属性が付与されていないので // 以下を実行すると例外が発生する. formatter.Serialize(stream, obj2); stream.Position = 0; Output.WriteLine(formatter.Deserialize(stream)); } catch (SerializationException ex) { Output.WriteLine("[ERROR]: {0}", ex.Message); } } // // シリアル化サロゲート. (SerializationSurrogate) // var obj3 = MakeNotSerializableObject(); using (var stream = new MemoryStream()) { var formatter = new BinaryFormatter(); // // シリアル化サロゲートを行うために、以下の手順で設定を行う. // // 1.SurrogateSelectorオブジェクトを用意. // 2.自作Surrogateクラスを用意. // 3.SurrogateSelector.AddSurrogateでSurrogateオブジェクトを設定 // 4.SurrogateSelectorをFormatterに設定. // // これにより、シリアライズ不可なオブジェクトをFormatterにてシリアライズ/デシリアライズ // する際にシリアル化サロゲートが行われるようになる。 // var selector = new SurrogateSelector(); var surrogate = new CanNotSerializeSurrogate(); var context = new StreamingContext(StreamingContextStates.All); selector.AddSurrogate(typeof(CanNotSerialize), context, surrogate); formatter.SurrogateSelector = selector; try { // 通常、以下を実行すると例外が発生するが // シリアル化サロゲートを行うので、エラーとならずシリアライズが成功する. formatter.Serialize(stream, obj3); stream.Position = 0; Output.WriteLine(formatter.Deserialize(stream)); } catch (SerializationException ex) { Output.WriteLine("[ERROR]: {0}", ex.Message); } } }