0

我目前正在将类保存UsageData到字节数组并将其存储在硬件密钥上。该硬件密钥为用户数据保留了最多 256 个字节。目前,我填充的属性类的大小约为 640 字节,已经压缩。现在我去创建一个UsageDataTemp没有任何属性/字段的临时类。我运行一个测试来查看没有任何值的字节数组有多大,它已经有 220 个字节的大小,只剩下 36 个字节要填充。

    [Serializable]
    public class UsageDataTemp
    {
        public byte[] ToByteArray()
        {
            var formatter = new BinaryFormatter();
            using (var stream = new MemoryStream())
            {
                //original serialization is 684 bytes long, compress it with the gzipstream
                using (var compressionStream = new GZipStream(stream, CompressionMode.Compress))
                {
                    formatter.Serialize(compressionStream, this);
                    compressionStream.Flush();
                    return stream.ToArray();
                }
            }
        }
    }

为什么没有任何值的空类已经需要 220 个字节来保存自己。有没有办法进一步压缩字节数组。还是我需要开始自己制作BinaryFormatter.

4

3 回答 3

2

你不告诉序列化器/反序列化器他们正在处理什么类型的对象——你可以传递给他们任何东西,他们“应该”工作。

这意味着必须将一些类型信息存储在二进制流中,才能确定正在反序列化的对象类型。这很容易(我认为)占 220 字节的开销。


如果每个字节都很重要,那么是的,您应该编写自己的代码来将您感兴趣的数据转换为最小表示,而不是使用诸如二进制序列化程序之类的通用机制。

于 2012-10-17T10:45:50.443 回答
1

为什么没有任何值的空类已经需要 220 个字节来保存自己?

为什么要问你能找到什么?这段代码已经产生了 33 个字节:

FileStream fs = new FileStream("Serialized.dat", FileMode.Create);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, "FooString");

因为被序列化的不仅仅是字符串本身。如果您序列化一个对象,那么它的类定义(以及它所在的程序集)也会被序列化。序列化这个类的一个实例:

[Serializable]
class Foo
{
    public String FooString { get; set; }
}

花费 166 个字节,而该FooString属性包含与之前序列化的原始字符串相同的数据。

所以:编写自己的序列化(或:加载/保存)逻辑。您是读取和写入该数据的人,因此您可以将空间中的特定字节分配给类的某些属性。

于 2012-10-17T10:56:06.493 回答
0

您不需要序列化您的结构。您所需要的只是将字节存储在硬件密钥中。您可以使用对象工厂模式来实现一些东西,给定一个 256 字节数组构建一个 UsageData 对象,并从一个 UsageData 对象获取您的 256 字节数组。

于 2012-10-17T10:50:41.797 回答