繁体   English   中英

C#将对象的字节数组转换为对象列表

[英]C# Convert a byte array of an object to list of an object

我有一个对象/类,其成员具有不同的值,并且都可以序列化,我可以将一个对象转换为byte []等。 我正在将这些对象的列表转换为一个大字节数组,如何将其转换回?

示例对象:

using System;
using System.IO;

[Serializable]
public class MyItem {
    internal string m_name = "";
    internal int m_position = 0;
    internal float m_color = 0f;
    internal int m_direction = 0;
    internal float m_power = 0f;

    public MyItem(string name, int position, float color, int direction, float power) {
        m_name = name;
        m_position = position;
        m_color = color;
        m_direction = direction;
        m_power = power;
    }

    public byte[] Serialize() {
        using (MemoryStream m = new MemoryStream()) {
            using (BinaryWriter writer = new BinaryWriter(m)) {
                writer.Write(m_name);
                writer.Write(m_position);
                writer.Write(m_color);
                writer.Write(m_direction);
                writer.Write(m_power);
            }
            return m.ToArray();
        }
    }

    public static MyItem Desserialize(byte[] data) {
        string name;
        int position;
        float color;
        int direction;
        float power;

        using (MemoryStream m = new MemoryStream(data)) {
            using (BinaryReader reader = new BinaryReader(m)) {
                name = reader.ReadString();
                position = reader.ReadInt32();
                color = reader.ReadSingle();
                direction = reader.ReadInt32();
                power = reader.ReadSingle();
            }
        }

        return new MyItem(name, position, color, direction, power);
    }
}

并转换为字节数组:

List<MyItem> itemlist = <...>;
List<byte[]> byteList = new List<byte[]>();
for (int i = 0; i < itemlist.Count; i++) {
    byteList.Add(itemlist[i].Serialize());
}
byte[] data = byteList.SelectMany(bytes => bytes).ToArray();

转换回:

????????

如注释中所述,您需要在流中写入每个对象的字节,以便能够反序列化单个对象。 例:

public static class MyItemSerializer
{
    public static byte[] Serialize(this IEnumerable<MyItem> items)
    {
        using (MemoryStream m = new MemoryStream()) 
        {
            using (BinaryWriter writer = new BinaryWriter(m, System.Text.Encoding.UTF8, true)) 
            {
                foreach (var item in items) 
                {
                    var itemBytes = item.Serialize();
                    writer.Write(itemBytes.Length);
                    writer.Write(itemBytes);
                }

            }

            return m.ToArray();
        }
    }

    public static List<MyItem> Deserialize(byte[] data)
    {
        var ret = new List<MyItem>();
        using (MemoryStream m = new MemoryStream(data))
        {
            using (BinaryReader reader = new BinaryReader(m, System.Text.Encoding.UTF8)) 
            {
                while (m.Position < m.Length)
                {
                    var itemLength = reader.ReadInt32();
                    var itemBytes = reader.ReadBytes(itemLength);
                    var item = MyItem.Desserialize(itemBytes);
                    ret.Add(item);
                }
            }
        }

        return ret;
    }
}

在这里您可以看到它的运行情况: https : //dotnetfiddle.net/Nk2cks

但是.NET已经包含一个名为BinaryFormatter的序列化程序

谷歌的Protobuf是另一种可能性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM