反序列化字节数组

时间:2014-11-25 18:01:17

标签: c# arrays deserialization

我有一个字节数组,我需要将其反序列化为多个对象类型。

该对象包含{float,short,int}。在Java中,我会使用ObjectInputStream这样做:

ObjectInputStream is;
is.readFloat()
is.readShort()
is.readInt()

我在C#中寻找一种方法。

读取第一个x字节为float,下一个y字节为short,下一个z字节为int。

1 个答案:

答案 0 :(得分:5)

您想使用BinaryReader

如果您有要反序列化的字节数组,则将其包装在内存流中,然后使用BinaryReader。像这样:

byte[] inputArray;  // somehow you've obtained this
using (var inputStream = new MemoryStream(inputArray))
{
    using (var reader = new BinaryReader(inputStream))
    {
        float f1 = reader.ReadSingle();
        short s1 = reader.ReadInt16();
        int i1 = reader.ReadInt32();
    }
}

你也可以使用BitConverter类来完成它,但你必须保持状态。例如,您可以像这样阅读floatshortint

byte[] inputArray;
int ix = 0;

float f1 = BitConverter.ToSingle(inputArray, ix);
ix += sizeof(float);  // increment to the next value

short s1 = BitConverter.ToInt16(inputArray, ix);
ix += sizeof(short);

int i1 = BitConverter.ToInt32(inputArray, ix);
ix += sizeof(int);

在这两者中,我建议使用BinaryReader,因为在大多数情况下,它更灵活,更容易使用。如果您只有少数要反序列化的项目,BitConverter会很方便。我认为它有可能更快,但除非你的应用高度性能敏感,否则无关紧要。如果反序列化数据非常关键,那么您可能会编写一个自定义反序列化器。