c# protobuf-net

c# - protobuf-net Serialice a cadena y almacene en la base de datos y luego se serializa



(2)

Me gustaría serializar / des-serializar un objeto usando una cadena. Solo para notar, cuando serializo / des-serializo a un archivo todo funciona bien. Lo que estoy tratando de hacer es obtener una cadena para poder almacenarla en la base de datos y luego extraerla más tarde para deserializarla.

Aquí está el código que funciona:

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

El objeto "CopiedBlocks" es la misma lista que estaba en "registrationBlocks" Funciona muy bien, todo serializado / des-serializado. Estoy guardando todo en corrientes aquí.

Aquí está el código que no funciona cuando intento involucrar una cadena:

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

En la última línea, cuando se deserializa, aparece una excepción: se ha emitido una excepción de tipo ''ProtoBuf.ProtoException''. No puedo profundizar en ello, la excepción interna es nula. No puedo entender por qué lo está haciendo.

Definitivamente lo he reducido al hecho de que cuando me involucro en una cuerda, se descompone. Estoy almacenando la cadena en una base de datos en un nvarchar (max) por lo que quiero la cadena.

Cualquier ayuda sería muy apreciada!


Basado en la respuesta y el comentario, uso estos:

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


Estoy un poco perdido por el uso del StreamReader en este contexto, me parece que podría omitir eso y hacer algo como lo siguiente para asegurarse de que no ocurra una codificación de una sola vía ...

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