我想将对象序列化为字符串,然后返回。
我们使用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);
我写了一个有用的方法来调用任何需要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的方法。
我写了一个有用的方法来调用任何需要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的方法。
我想将对象序列化为字符串,然后返回。
与其他答案不同,但对大多数对象类型来说,最直接的方法是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
}
所有受支持类型的公共属性都将被序列化。甚至支持一些集合结构,并将隧道向下到子对象属性。您可以控制属性上的属性的序列化工作方式。
这并不适用于所有对象类型,一些数据类型不支持序列化,但总的来说它是非常强大的,并且您不必担心编码。