protobuf-net序列化为字符串并存储在数据库中然后进行序列化
我想使用字符串序列化/反序列化对象。 需要注意的是,当我序列化/反序列化到文件时,一切正常。 我想要做的是获取一个字符串,以便我可以将它存储在数据库中,然后将其拉出来反序列化。
这是有效的代码:
MemoryStream msTest = new MemoryStream(); Serializer.Serialize(msTest, registrationBlocks); msTest.Position = 0; List CopiedBlocks = new List(); CopiedBlocks = Serializer.Deserialize<List>(msTest);
“CopiedBlocks”对象与“registrationBlocks”中的列表相同,工作正常,所有序列化/反序列化。 我在这里保留所有内容。
当我尝试获取涉及的字符串时,以下代码不起作用:
MemoryStream msTestString = new MemoryStream(); Serializer.Serialize(msTestString, registrationBlocks); msTestString.Position = 0; StreamReader srRegBlock = new StreamReader(msTestString); byte[] bytedata64 = System.Text.Encoding.Default.GetBytes(srRegBlock.ReadToEnd()); string stringBase64 = Convert.ToBase64String(bytedata64); byte[] byteAfter64 = Convert.FromBase64String(stringBase64); MemoryStream afterStream = new MemoryStream(byteAfter64); List CopiedBlocksString = new List(); CopiedBlocksString = Serializer.Deserialize<List>(afterStream);
在反序列化的最后一行,我得到一个exception:抛出了类型’ProtoBuf.ProtoException’的exception。 我无法钻进它,内部exception为null。 我无法弄清楚它为什么要这样做。
我肯定已经把它缩小到这样一个事实:当我得到一个字符串时它会变得混乱。 我将字符串存储在nvarchar(max)的数据库中,这就是我想要字符串的原因。
任何帮助将非常感激!
在这种情况下我使用StreamReader
有点迷失,在我看来你可以省略它并做下面的事情以确保没有单向编码发生..
MemoryStream msTestString = new MemoryStream(); Serializer.Serialize(msTestString, registrationBlocks); string stringBase64 = Convert.ToBase64String(msTestString.ToArray()); byte[] byteAfter64 = Convert.FromBase64String(stringBase64); MemoryStream afterStream = new MemoryStream(byteAfter64); List CopiedBlocksString = new List (); CopiedBlocksString = Serializer.Deserialize>(afterStream);
根据答案和评论,我使用这些:
internal static string SerializeToString_PB(this T obj) { using (MemoryStream ms = new MemoryStream()) { ProtoBuf.Serializer.Serialize(ms, obj); return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length); } } internal static T DeserializeFromString_PB (this string txt) { byte[] arr = Convert.FromBase64String(txt); using (MemoryStream ms = new MemoryStream(arr)) return ProtoBuf.Serializer.Deserialize (ms); }