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

我们使用protobuf-net成功地将一个对象转换成一个流。

然而,流到字符串和返回…不太成功。在经过StreamToString和StringToStream之后,新的stream不是 通过protobuf-net反序列化;它会引发算术操作,导致溢出异常。如果我们反序列化原始流,它就可以工作。

我们的方法:

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);

当前回答

我刚刚测试了这个,工作正常。

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();

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

其他回答

在想要序列化/反序列化poco的情况下,Newtonsoft的JSON库非常好。我使用它将SQL Server中的POCOs持久化为nvarchar字段中的JSON字符串。需要注意的是,由于它不是真正的反/序列化,因此它不会保留私有/受保护成员和类层次结构。

试试这个。

string output1 = Encoding.ASCII.GetString(byteArray, 0, byteArray.Length)

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

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

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

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

看看Convert。ToBase64String和Convert.FromBase64String。

 StreamReader reader = new StreamReader(strm, System.Text.Encoding.UTF8);
        var final1 = reader.ReadToEnd();

大多数问题的主要原因是编码类型…这里默认为System.Text.Encoding。UTF8修复了这个问题…

享受……

我写了一个有用的方法来调用任何需要StreamWriter的动作,并将其写入字符串。方法是这样的;

static void SendStreamToString(Action<StreamWriter> action, out string destination)
{
    using (var stream = new MemoryStream())
    using (var writer = new StreamWriter(stream, Encoding.Unicode))
    {
        action(writer);
        writer.Flush();
        stream.Position = 0;
        destination = Encoding.Unicode.GetString(stream.GetBuffer(), 0, (int)stream.Length);
    }
}

你可以这样用;

string myString;

SendStreamToString(writer =>
{
    var ints = new List<int> {1, 2, 3};
    writer.WriteLine("My ints");
    foreach (var integer in ints)
    {
        writer.WriteLine(integer);
    }
}, out myString);

我知道这可以用StringBuilder做得更容易,重点是你可以调用任何采用StreamWriter的方法。