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

fli*_*hia 152 .net c# serialization protobuf-net deserialization

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

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

但是,Stream to string and back ...不太成功.经过StreamToString并且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);
}
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

Ehs*_*san 190

我刚测试过这个并且运行正常.

string test = "Testing 1-2-3";

// convert string to stream
byte[] byteArray = Encoding.ASCII.GetBytes(test);
MemoryStream stream = new MemoryStream(byteArray);

// convert stream to string
StreamReader reader = new StreamReader(stream);
string text = reader.ReadToEnd();
Run Code Online (Sandbox Code Playgroud)

如果stream已经写入,您可能希望在读出文本之前先寻找开头:stream.Seek(0, SeekOrigin.Begin);

  • 并且不要忘记 StreamReader reader = new StreamReader(stream); 周围的 using 块。 (5认同)

Mar*_*ell 56

这是如此常见但却非常错误.Protobuf数据不是字符串数据.它当然不是ASCII.您正在向后使用编码.文本编码传输:

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

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

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

看看Convert.ToBase64String和Convert.FromBase64String


小智 9

 StreamReader reader = new StreamReader(strm, System.Text.Encoding.UTF8);
        var final1 = reader.ReadToEnd();
Run Code Online (Sandbox Code Playgroud)

大多数问题的主要原因是编码类型...默认情况下 System.Text.Encoding.UTF8 修复了该问题...

享受...


Dam*_*ith 5

当你测试尝试使用UTF8如下的编码流

var stream = new MemoryStream();
var streamWriter = new StreamWriter(stream, System.Text.Encoding.UTF8);
Serializer.Serialize<SuperExample>(streamWriter, test);
Run Code Online (Sandbox Code Playgroud)


小智 5

试试这个.

string output1 = Encoding.ASCII.GetString(byteArray, 0, byteArray.Length)
Run Code Online (Sandbox Code Playgroud)


Wol*_*eld 5

UTF8 MemoryStream到String的转换:

var res = Encoding.UTF8.GetString(stream.GetBuffer(), 0 , (int)stream.Length)
Run Code Online (Sandbox Code Playgroud)

  • @Mortennobel `ToArray()` 在内存中分配一个新数组并从缓冲区复制数据,如果您正在处理大量数据,这可能会产生严重影响。 (4认同)
  • 请改用ToArray()。缓冲区可能大于已使用数据的大小。ToArray()返回具有正确大小的数据的副本。`var array = stream.ToArray(); var str = Encoding.UTF8.GetString(array,0,array.Length);`。另请参见https://msdn.microsoft.com/zh-cn/library/system.io.memorystream.getbuffer.aspx?ranMID=24542&amp;ranEAID=TnL5HPStwNw&amp;ranSiteID=TnL5HPStwNw-fWxoHnp968IcSsgF87gs3g&amp;dduid=(af5S)430(d5e) fWxoHnp968IcSsgF87gs3g)() (2认同)