Soru Protobuf-net Dize ve Veritabanına Dizine Serialize Edilsin Sonra De Serialize


Bir dizeyi kullanarak bir nesneyi serileştirmek / serileştirmek istiyorum. Sadece not etmek gerekirse, bir dosyaya serileştirdiğimde / serileştirdiğimde her şey iyi çalışıyor. Yapmaya çalıştığım şey bir dizge almaktır, böylece veritabanında saklayabilirim ve daha sonra serileştirmek için dışarı çekebilirim.

İşte çalışan kod:

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

"CopiedBlocks" nesnesi, "registrationBlocks" bölümünde yer alan aynı listedir, harika çalışır, herşey seri / diziselleştirilir. Ben her şeyi burada akış halinde tutuyorum.

Burada bir dize almaya çalıştığımda çalışmayan kod:

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

Son satırda serileştirmeye geçtiğinde, bir istisna alıyorum: 'ProtoBuf.ProtoException' türünün istisnası atıldı. İçine giremem, iç istisna null. Bunu neden yaptığını anlayamıyorum.

Bir ipi aldığımda ahbap olduğu gerçeğine kadar daralttım. Dizeyi nvarchardaki (max) bir veritabanında saklıyorum, bu yüzden dizgiyi istiyorum.

Herhangi bir yardım süper takdir edilecektir!


18
2017-08-01 23:18


Menşei




Cevaplar:


Ben kullanımı ile biraz kayboldum StreamReader Bu bağlamda, tek yönlü bir kodlama olmadığından emin olmak için bunu atlayıp aşağıdakine benzer bir şey yapabileceksiniz.

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

24
2017-08-01 23:58



İyi cevap; var küçük eğer isterseniz optimizasyon yapabilirsiniz - Convert.ToBase64String(msTestString.GetBuffer(), 0, (int)msTestString.Length) fazladan yaratmayı önleyen byte[]. Ama "olduğu gibi" çalışır. - Marc Gravell♦


Cevap ve yoruma dayanarak bunları kullanıyorum:

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

1
2018-04-18 07:29