いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

バイナリ形式でのシリアライズ

XML形式の場合は、XmlSerializerを使いますがバイナリの場合は

  1. シリアライズしたいクラスに[Serializable]属性でマーク
  2. BinaryFormatterを利用する

という手順になります。


以下サンプルです。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace Gsf.Samples.CSharp{

    [Serializable]
    public class BinarySerializableClass{
        string _value;

        public string Value{
            get{
                return _value;
            }
            set{
                _value = value;
            }
        }
    }

    class BinarySerializeSample{

        const string FILE_NAME = "BinarySerializableClass.bin";

        public void Execute(){

            try{

                BinarySerializableClass obj = new BinarySerializableClass();
                obj.Value = obj.GetType().Name;

                //
                // 使用するフォーマッターを作成.
                //
                IFormatter formatter = new BinaryFormatter();

                //
                // シリアライズ.
                //
                using(Stream stream = new FileStream(FILE_NAME, FileMode.Create, FileAccess.Write)){
                    formatter.Serialize(stream, obj);
                }

                //
                // 出力内容を確認.
                //
                using(Stream stream = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read)){
                    byte[] buffer = new byte[stream.Length];

                    stream.Read(buffer, 0, buffer.Length);

                    foreach(byte b in buffer){
                        Console.Write*1{
                    BinarySerializableClass deObj = formatter.Deserialize(stream) as BinarySerializableClass;

                    Console.WriteLine(deObj.Value);
                }

            }finally{
                //
                // 後始末.
                //
                File.Delete(FILE_NAME);
            }

        }

        static void Main(){
            new BinarySerializeSample().Execute();
        }
    }
}

*1:char) b); } } // // デシリアライズ. // using(Stream stream = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read