将流转换为字符串,然后再转换回来.我们遗漏了什么?

Converting Stream to String and back...what are we missing?(将流转换为字符串,然后再转换回来.我们遗漏了什么?)

本文介绍了将流转换为字符串,然后再转换回来.我们遗漏了什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要将对象序列化为字符串,然后再序列化。

我们使用协议buf-net成功地将对象转换为流并返回。 但是,流到字符串并返回.不太成功。经过StreamToStringStringToStream之后,新的Stream不 由协议buf-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);

推荐答案

这很常见,但却大错特错。Protobuf数据不是字符串数据。当然不是ASCII。您正在向后使用编码。a文本编码传输:

  • 将任意字符串转换为格式化字节
  • 将格式化的字节转换为原始字符串

您没有"格式化字节"。您有任意字节。您需要使用类似于基数n(通常为基数64)的编码。此传输

  • 将任意字节转换为格式化字符串
  • 将格式化字符串转换为原始字节
查看Convert.ToBase64String并进行转换。FromBase64String

这篇关于将流转换为字符串,然后再转换回来.我们遗漏了什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:将流转换为字符串,然后再转换回来.我们遗漏了什么?

基础教程推荐