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