我可以使用C#序列化来读取自定义格式的二进制文件吗?

我可以使用C#序列化来读取自定义格式的二进制文件吗?,c#,serialization,binary-data,C#,Serialization,Binary Data,我有一个自定义的二进制文件,我想读入我的C#程序 有几种不同的格式,有些是MSB优先,有些是LSB优先,有些是变量顺序不同的格式 目前,我有一个类可以读取正确的字节数,一次读取一个字节 这是非常缓慢的,所以我希望提高性能的任何方式,我可以 序列化是否可能表现得更好?如果是这样,我所描述的场景是否可能?是否可以为big/little-endian格式定制BinaryFormatter 谢谢。不,不行。当然可以,但转换的开销可能会降低性能。使用BinaryFormatter无法做到这一点-它需要在对

我有一个自定义的二进制文件,我想读入我的C#程序

有几种不同的格式,有些是MSB优先,有些是LSB优先,有些是变量顺序不同的格式

目前,我有一个类可以读取正确的字节数,一次读取一个字节

这是非常缓慢的,所以我希望提高性能的任何方式,我可以

序列化是否可能表现得更好?如果是这样,我所描述的场景是否可能?是否可以为big/little-endian格式定制BinaryFormatter


谢谢。

不,不行。当然可以,但转换的开销可能会降低性能。

使用BinaryFormatter无法做到这一点-它需要在对象周围添加额外的元数据/填充。您必须从
或类似地通过二进制读取器手动读取

在完成了一些非常类似的代码之后,我会编写我自己的阅读器,它位于流的顶部,使用如下方法:
ReadInt32LittleEndian
ReadInt32BigEndian
(等等)和使用shift(
)来组装字节。但重要的是,我将使用后备缓冲区来减少对底层流的调用量(即使使用缓冲区,速度也可能慢得令人无法接受)

让我让你们参考protobuf网络中的一些代码,它可以做到这一点。。。特别是,举一个例子:

    /// <summary>
    /// Reads an unsigned 32-bit integer from the stream; supported wire-types: Variant, Fixed32, Fixed64
    /// </summary>
    public uint ReadUInt32()
    {
        switch (wireType)
        {
            case WireType.Variant:
                return ReadUInt32Variant(false);
            case WireType.Fixed32:
                if (available < 4) Ensure(4, true);
                position += 4;
                available -= 4;
                return ((uint)ioBuffer[ioIndex++])
                    | (((uint)ioBuffer[ioIndex++]) << 8)
                    | (((uint)ioBuffer[ioIndex++]) << 16)
                    | (((uint)ioBuffer[ioIndex++]) << 24);
            case WireType.Fixed64:
                ulong val = ReadUInt64();
                checked { return (uint)val; }
            default:
                throw CreateException();
        }
    }
//
///从流中读取无符号32位整数;支持的导线类型:变量、固定32、固定64
/// 
公共uint ReadUInt32()
{
开关(线式)
{
外壳接线类型。变型:
返回readuint32变量(false);
案例WireType.Fixed32:
如果(可用<4),确保(4,正确);
位置+=4;
可用-=4;
返回((uint)ioBuffer[ioIndex++]
|((uint)ioBuffer[ioIndex++]