読者です 読者をやめる 読者になる 読者になる

MessagePack for C#でクラスのリストをシリアライズ

C#

クラスは一旦IEnumerableに変換する必要がある。
それのリストをシリアライズするには、IEnumerable>ではダメなので、IEnumerableをSerializableValueに変換して、最終的にIEnumerableにしないといけない。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

using SUtils.Serialization;
using SUtils.Serialization.MsgPack;

namespace CsCosnole
{
    class Data
    {
        public int value;
        public string str;

        public Data(int n, string s)
        {
            value = n;
            str = s;
        }
    }

    class Program
    {
        static void Deserialize()
        {
            using (FileStream stream = new FileStream(@"C:\output_data.mpac", FileMode.Open))
            {
                ISerializationProvider serializer = new MsgPackSerializationProvider();
                SerializableValue obj = serializer.Deserialize(stream);

                foreach (SerializableValue i in obj.ArrayItems)
                {
                    int value = (int)i[0];
                    string name = (string)i[1];

                    Console.WriteLine("{0}, {1}", value, name);
                }
            }
        }

        static IEnumerable<SerializableValue> DataToList(Data data)
        {
            yield return (SerializableValue)data.value;
            yield return (SerializableValue)data.str;
        }

        static void Serialize()
        {
            ISerializationProvider serializer = new MsgPackSerializationProvider();

            List<Data> ls = new List<Data>() { new Data(1, "a"), new Data(2, "b"), new Data(3, "c") };

            IEnumerable<SerializableValue> datas = ls.Select(x => new SerializableValue(DataToList(x)));

            using (FileStream stream = new FileStream(@"C:\output_data.mpac", FileMode.CreateNew))
            {
                serializer.Serialize(stream, new SerializableValue(datas));
            }
        }

        static void Main(string[] args)
        {
            Serialize();
            Deserialize();
        }
    }
}
1, a
2, b
3, c

めんどくさいですが、できました。