gpt4 book ai didi

c# - protobuf-net 在调用 Deserialize 时返回 null

转载 作者:行者123 更新时间:2023-11-30 20:53:34 28 4
gpt4 key购买 nike

我的最终目标是使用 protobuf-net 和 GZipStream 尝试压缩 List<MyCustomType>对象存储在 SQL Server 的 varbinary(max) 字段中。我正在进行单元测试,以了解一切如何运作以及如何组合在一起。

目标 .NET 框架是 3.5。

我目前的流程是:

  1. 使用 protobuf-net 序列化数据(好)。
  2. 使用 GZipStream 压缩来自 #1 的序列化数据(好)。
  3. 将压缩数据转换为 base64 字符串(好)。

此时,第 3 步的值将存储在 varbinary(max) 字段中。我无法控制这个。这些步骤需要采用 base64 字符串并将其反序列化为具体类型。

  1. 将 base 64 字符串转换为 byte[] (好)。
  2. 使用 GZipStream 解压缩数据(好)。
  3. 使用 protobuf-net 反序列化数据(不好)。

有人可以协助解释为什么要调用 Serializer.Deserialize<string> 吗?返回 null ?我坚持这个,希望一双新的眼睛会有所帮助。

FWIW,我使用 List<T> 尝试了另一个版本其中 T 是我创建的自定义类,我 Deserialize<>仍然返回 null。

FWIW 2,data.txt 是驻留在我的 C: 上的一个 4MB 纯文本文件。

    [Test]
public void ForStackOverflow()
{
string data = "hi, my name is...";
//string data = File.ReadAllText(@"C:\Temp\data.txt");

string serializedBase64;

using (MemoryStream protobuf = new MemoryStream())
{
Serializer.Serialize(protobuf, data);

using (MemoryStream compressed = new MemoryStream())
{
using (GZipStream gzip = new GZipStream(compressed, CompressionMode.Compress))
{
byte[] s = protobuf.ToArray();
gzip.Write(s, 0, s.Length);
gzip.Close();
}

serializedBase64 = Convert.ToBase64String(compressed.ToArray());
}
}

byte[] base64byteArray = Convert.FromBase64String(serializedBase64);

using (MemoryStream base64Stream = new MemoryStream(base64byteArray))
{
using (GZipStream gzip = new GZipStream(base64Stream, CompressionMode.Decompress))
{
using (MemoryStream plainText = new MemoryStream())
{
byte[] buffer = new byte[4096];
int read;

while ((read = gzip.Read(buffer, 0, buffer.Length)) > 0)
{
plainText.Write(buffer, 0, read);
}

// why does this call to Deserialize return null?
string deserialized = Serializer.Deserialize<string>(plainText);

Assert.IsNotNull(deserialized);
Assert.AreEqual(data, deserialized);
}
}
}
}

最佳答案

因为您在写入 plainText 后没有倒​​带。实际上,整个 Stream 是不必要的 - 这是可行的:

using (MemoryStream base64Stream = new MemoryStream(base64byteArray))
{
using (GZipStream gzip = new GZipStream(
base64Stream, CompressionMode.Decompress))
{
string deserialized = Serializer.Deserialize<string>(gzip);

Assert.IsNotNull(deserialized);
Assert.AreEqual(data, deserialized);
}
}

同样,这应该适用于序列化:

using (MemoryStream compressed = new MemoryStream())
{
using (GZipStream gzip = new GZipStream(
compressed, CompressionMode.Compress, true))
{
Serializer.Serialize(gzip, data);
}

serializedBase64 = Convert.ToBase64String(
compressed.GetBuffer(), 0, (int)compressed.Length);
}

关于c# - protobuf-net 在调用 Deserialize 时返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19868833/

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