2011-06-08 117 views
0

我想序列化使用protobuf-net字符串和反序列化回對象。它工作正常,如果我序列化文件像.bin但是下面的代碼會引發異常,而反序列化。有任何想法嗎?protobuf-net反序列化錯誤無效標記:0

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Runtime.Serialization; 
using ProtoBuf; 

namespace Proto 
{ 
class Program 
{ 
    public long MemUsed = 0; 
    NetDataContractSerializer ser = new NetDataContractSerializer(); 

    static void Main(string[] args) 
    { 
     var person = new Person { 
      Id = 12345, Name = "Fred", 
      Address = new Address 
      { 
       Line1 = "Flat 1", 
       Line2 = "The Meadows" 
      } 
     }; 
     Console.WriteLine("Serializing ....."); 
     var result = Serialize<Person>(person); 
     Console.WriteLine(" Serialization Complete ....."); 
     Console.WriteLine("Press key to Deserialize ...."); 
     Console.ReadKey(); 
     var person2 = new Person(); 
     DeSerialize<Person>(ref person2,result); 
     Console.WriteLine(person2.Name); 
     Console.ReadLine(); 
    } 

    public static string Serialize<T>(T myObj) 
    { 
     string retVal = "";    
     using (MemoryStream memStream = new MemoryStream()) 
     { 
      Serializer.Serialize<T>(memStream, myObj); 
      memStream.Position = 0; 
      retVal = new StreamReader(memStream).ReadToEnd(); 
     } 
     return (retVal);   
    } 

    public static void DeSerialize<T>(ref T myObj, string xmlString) 
    { 
     byte[] byteArray = Encoding.ASCII.GetBytes(xmlString); 
     MemoryStream stream = new MemoryStream(byteArray,0,byteArray.Length); 
     stream.Capacity = Convert.ToInt32(stream.Length); 
     myObj = Serializer.Deserialize<T>(stream); 
     stream.Close();  
    } 
} 

[ProtoContract] 
class Person { 
    [ProtoMember(1)] 
    public int Id {get;set;} 
    [ProtoMember(2)] 
    public string Name { get; set; } 
    [ProtoMember(3)] 
    public Address Address {get;set;} 
}  
[ProtoContract] 
class Address { 
    [ProtoMember(1)] 
    public string Line1 {get;set;} 
    [ProtoMember(2)] 
    public string Line2 {get;set;} 
} 
} 
+0

參數「xmlString」特別容易誤導 - 這當然不是XML:p – 2011-06-08 16:04:21

回答

4

您正在使用TextReader處理非文本二進制塊。這不行;基本上你已經通過嘗試UTF解碼不是UTF的東西來破壞二進制文件,然後重新編碼你獲得的(無意義的)字符串。

要麼返回二進制(例如一個字節[]),或者如果它必須字符串:經由Convert.ToBase64String等

也見使用鹼-64:http://marcgravell.blogspot.com/2010/03/binary-data-and-strings.html

相關問題