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);
                }
            }
        }
        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);
                }
            }
        }