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

我们使用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);

当前回答

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

与其他答案不同,但对大多数对象类型来说,最直接的方法是XmlSerializer:

        Subject subject = new Subject();
        XmlSerializer serializer = new XmlSerializer(typeof(Subject));
        using (Stream stream = new MemoryStream())
        {
            serializer.Serialize(stream, subject);
            // do something with stream
            Subject subject2 = (Subject)serializer.Deserialize(stream);
            // do something with subject2
        }

所有受支持类型的公共属性都将被序列化。甚至支持一些集合结构,并将隧道向下到子对象属性。您可以控制属性上的属性的序列化工作方式。

这并不适用于所有对象类型,一些数据类型不支持序列化,但总的来说它是非常强大的,并且您不必担心编码。

其他回答

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

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

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

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

享受……

UTF8内存流到字符串的转换:

var res = Encoding.UTF8.GetString(stream.GetBuffer(), 0 , (int)stream.Length)

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

与其他答案不同,但对大多数对象类型来说,最直接的方法是XmlSerializer:

        Subject subject = new Subject();
        XmlSerializer serializer = new XmlSerializer(typeof(Subject));
        using (Stream stream = new MemoryStream())
        {
            serializer.Serialize(stream, subject);
            // do something with stream
            Subject subject2 = (Subject)serializer.Deserialize(stream);
            // do something with subject2
        }

所有受支持类型的公共属性都将被序列化。甚至支持一些集合结构,并将隧道向下到子对象属性。您可以控制属性上的属性的序列化工作方式。

这并不适用于所有对象类型,一些数据类型不支持序列化,但总的来说它是非常强大的,并且您不必担心编码。

当你测试尝试UTF8编码流如下

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