小编典典

将 Stream 转换为 String 并返回...我们缺少什么?

all

我想将对象序列化为字符串,然后返回。

我们使用 protobuf-net 将对象转换为 Stream 并成功返回。

但是,Stream to string and back…
不是那么成功。经过StreamToStringand之后StringToStream,新Stream的没有被 protobuf-net
反序列化;它引发了一个Arithmetic Operation resulted in an Overflow例外。如果我们反序列化原始流,它就可以工作。

我们的方法:

public static string StreamToString(Stream stream)
{
    stream.Position = 0;
    using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
    {
        return reader.ReadToEnd();
    }
}

public static Stream StringToStream(string src)
{
    byte[] byteArray = Encoding.UTF8.GetBytes(src);
    return new MemoryStream(byteArray);
}

我们使用这两个的示例代码:

MemoryStream stream = new MemoryStream();
Serializer.Serialize<SuperExample>(stream, test);
stream.Position = 0;
string strout = StreamToString(stream);
MemoryStream result = (MemoryStream)StringToStream(strout);
var other = Serializer.Deserialize<SuperExample>(result);

阅读 238

收藏
2022-06-30

共1个答案

小编典典

这是很常见的,但却是非常错误的。Protobuf 数据不是字符串数据。它当然不是ASCII。 您正在使用反向 编码。文本编码传输:

  • 格式化字节的任意字符串
  • 格式化字节到原始字符串

您没有“格式化字节”。你有 任意字节 。您需要使用类似 base-n(通常:base-64)编码的东西。这转移

  • 格式化字符串的任意字节
  • 原始字节的格式化字符串

看看 Convert.ToBase64String 和 Convert。FromBase64String

2022-06-30