gpt4 book ai didi

c# - 序列化数据太大

转载 作者:太空宇宙 更新时间:2023-11-03 17:55:09 24 4
gpt4 key购买 nike

我将每个播放器服务器端的数据序列化,大小约为 128kb。我序列化了一个 [255,255] bool 数组,这是映射所必需的,我可以使用什么替代方案,因为我听说 gzip 实际上会增加大小?

我听说过 protobuf-net,但它没有文档,互联网上也没有示例。

最佳答案

我要做的第一件事是:不要将该数据存储在 bool[,] 中 - 这非常低效,而且存储起来真的很痛苦。我会编写一个包装器,将其填充为平面 byte[]:

public sealed class BitGrid
{
public BitGrid() {
// 255 * 255 = 32 bytes per row, 255 rows
bytes = new byte[8160];
}
public BitGrid(byte[] data)
{
if (data == null) throw new ArgumentNullException("data");
if (data.Length != 8160) throw new ArgumentException("data");
this.bytes = data;
}

readonly byte[] bytes;

public bool this[byte x, byte y]
{
get
{
int xByte = x / 8, xBit = x % 8;
byte val = bytes[(32 * y) + xByte];
switch (xBit)
{
case 0: return (val & 1) != 0;
case 1: return (val & 2) != 0;
case 2: return (val & 4) != 0;
case 3: return (val & 8) != 0;
case 4: return (val & 16) != 0;
case 5: return (val & 32) != 0;
case 6: return (val & 64) != 0;
case 7: return (val & 128) != 0;
}
throw new InvalidOperationException("oops!");
}
set
{
int xByte = x / 8, xBit = x % 8;
int offset = (32 * y) + xByte;
byte val = bytes[offset];
if (value)
{
switch (xBit)
{
case 0: val |= 1; break;
case 1: val |= 2; break;
case 2: val |= 4; break;
case 3: val |= 8; break;
case 4: val |= 16; break;
case 5: val |= 32; break;
case 6: val |= 64; break;
case 7: val |= 128; break;
}
}
else
{
switch (xBit)
{
case 0: val &= 254; break;
case 1: val &= 253; break;
case 2: val &= 251; break;
case 3: val &= 247; break;
case 4: val &= 239; break;
case 5: val &= 223; break;
case 6: val &= 191; break;
case 7: val &= 127; break;
}
}

bytes[offset] = val;
}
}
public byte[] ToArray()
{
return (byte[])bytes.Clone();
}
}

然后将其序列化,就是:

byte[] data = grid.ToArray();
// store "data"

反序列化就是:

byte[] data = ...
grid = new BitGrid(data);

您可以使用 File.ReadAllBytes/File.WriteAllBytes 方法将 byte[] 保存到磁盘或从磁盘加载,或者如果如果您有其他数据要存储,那么任何标准序列化程序都可以使用 byte[] 正常工作。此数据始终为 8160 字节 - 略低于 8k。

关于c# - 序列化数据太大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13001339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com