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