序列化为字符串并存储在数据库中,然后反序列化

本文关键字:数据库 然后 反序列化 存储 字符 字符串 串并 序列化 | 更新日期: 2023-09-27 18:04:17

我想使用字符串序列化/反序列化对象。需要注意的是,当我序列化/反序列化一个文件时,一切正常。我要做的是得到一个字符串,这样我就可以把它存储在数据库中,然后把它拉出来反序列化。

下面是有效的代码:

MemoryStream msTest = new MemoryStream();
Serializer.Serialize(msTest, registrationBlocks);
msTest.Position = 0;
List<RVRegistrationBlock> CopiedBlocks = new List<RVRegistrationBlock>();
CopiedBlocks = Serializer.Deserialize<List<RVRegistrationBlock>>(msTest);

" copyedblocks "对象与"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<RVRegistrationBlock> CopiedBlocksString = new List<RVRegistrationBlock>();
CopiedBlocksString = Serializer.Deserialize<List<RVRegistrationBlock>>(afterStream);

在反序列化的最后一行,我得到了一个异常:类型为'ProtoBuf '的异常。抛出ProtoException'。我不能钻进去,内部异常为空。我不明白它为什么这样做。

我已经明确地把它缩小到当我加入一个字符串时,它会变得混乱。我将字符串存储在一个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<RVRegistrationBlock> CopiedBlocksString = new List<RVRegistrationBlock>();
CopiedBlocksString = Serializer.Deserialize<List<RVRegistrationBlock>>(afterStream);

根据回答和评论,我使用这些:

        internal static string SerializeToString_PB<T>(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<T>(this string txt)
        {
            byte[] arr = Convert.FromBase64String(txt);
            using (MemoryStream ms = new MemoryStream(arr))
                return ProtoBuf.Serializer.Deserialize<T>(ms);
        }
        public static string ToProtobufString(this object model) {
            using var memString = new MemoryStream();
            Serializer.Serialize(memString, model);
            return Convert.ToBase64String(memString.GetBuffer(), 0, (int)memString.Length);
        }
        public static T FromProtobufString<T>(this string protobuf) where T : class {
            var byteAfter64 = Convert.FromBase64String(protobuf);
            using var mem = new MemoryStream(byteAfter64);
            return mem.FromProtobuf<T>();
        }
相关文章: