2011-08-01 9 views
18

文字列を使用してオブジェクトをシリアル化/逆シリアル化したいと思います。注記すると、私がシリアル化/デシリアライズすると、すべて正常に動作します。私がしようとしているのは、文字列を取得してデータベースに格納し、後でそれを取り出してデシリアライズすることです。ここでprotobuf-net文字列にシリアル化してデータベースに格納してからシリアル化する

は動作するコードです:

MemoryStream msTest = new MemoryStream(); 
Serializer.Serialize(msTest, registrationBlocks); 
msTest.Position = 0; 
List<RVRegistrationBlock> CopiedBlocks = new List<RVRegistrationBlock>(); 
CopiedBlocks = Serializer.Deserialize<List<RVRegistrationBlock>>(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<RVRegistrationBlock> CopiedBlocksString = new List<RVRegistrationBlock>(); 
CopiedBlocksString = Serializer.Deserialize<List<RVRegistrationBlock>>(afterStream); 

、私は例外を取得:タイプの例外「いるProtobuf。 ProtoException 'がスローされました。私はそれにドリルすることはできません、内部の例外はnullです。なぜそれがそれをやっているのか分かりません。

私は文字列を取得すると、それはひそかになるという事実に至りました。私は文字列を必要とする理由は、nvarchar(最大)のデータベースに文字列を格納しています。

ご迷惑をおかけして申し訳ございません。

答えて

24

私はこのコンテキストで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); 
+11

良い答え。あなたが望むなら、* Convert.ToBase64String(msTestString.GetBuffer()、0、(int)msTestString.Length) 'という特別なマイナーな最適化があります。しかし、それは "そのまま"動くでしょう。 –

1

の回答やコメントをもとに、私はこれらの使用:

 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); 
     } 
関連する問題