2011-08-17 68 views
2

只能序列化該類的幾個屬性是可能的嗎? 例如:Protobuf-net - 僅序列化幾個屬性

public class Client 
{ 
    [ProtoMember(1)] 
    public int Id { get; set; } 

    [ProtoMember(2)] 
    public string Name { get; set; } 

    public int Age { get; set; } 

    [ProtoMember(3)] 
    public string Guid { get; set; } 
} 

因此,我得到的 「ID」 的值不正確。其他屬性是正確的。 如果我用「[ProtoMember]」填充所有屬性,「id」的值是正確的。 爲什麼?


其實這個錯誤是由其他原因引起的,您可能可以幫助我。

我將String轉換爲Stream來執行任務。在時間扭轉這種轉換我在標識

的值
var cli = new Client 
{ Id = 222, Guid = "52369-fe5r6-74e2g-j1i4e", Age = 29, Name = "José"}; 

//Serialize 
var ms = new MemoryStream(); 
Serializer.Serialize(ms, cli); 
ms.Position = 0; 
var reader = new StreamReader(ms); 
var strStream = reader.ReadToEnd(); 

//Deserialize 
var ms2 = new MemoryStream(Encoding.UTF8.GetBytes(strStream)); 


var obj = Serializer.Deserialize<Client>(ms2); 

因此,上文127的任何值,被轉換爲不同的INT錯誤。例如:3104751

我的轉換是錯誤的?

對不起:對不起英語差

+1

(我protobuf網的作者),以班級爲寫得很好(只要你按照alfonso的建議添加'[ProtoContract]')。請澄清你的意思是「Id的值」不正確「 - 你看到了什麼? –

+0

(添加一個答案重新編輯) –

回答

2

是的。只要確保包含該類的[ProtoContract]屬性,並在序列化和反序列化時使用完全相同的合同。

+0

何塞,沒有看到你的代碼,它將不可能幫助你。在這裏粘貼一些代碼,以便人們可以看到你想要做的事情。如果你的問題與此不相關,你應該創建另一個以避免混淆。 – alf

1

問題是由於編碼。你爲什麼要讀流然後創建另一個?像這樣的東西應該工作:

var cli = new Client{ Id = 222, Guid = "52369-fe5r6-74e2g-j1i4e", Age = 29, Name = "José"}; 

//Serialize 
var ms = new MemoryStream(); 
Serializer.Serialize(ms, cli); 
ms.Position = 0; 

//Deserialize 
var obj = Serializer.Deserialize<Client>(ms); 
+0

由於我將Stream轉換爲String,因此在某些進程中使用String,然後轉換回專業對象。 –

+0

你應該考慮使用流而不是將其轉換爲字符串。他們是完全不同的概念。不過,我認爲你可以通過在StreamReader構造函數中指明UTF8編碼來解決你的問題:新的StreamReader(ms,System.Text.Encoding.UTF8) – alf

+0

我測試了這段代碼,錯誤依然存在。 我需要轉換爲字符串,因爲我做了一些涉及數據庫和其他業務規則的操作。 –

2

隨着你的編輯,錯誤是顯而易見的;您正在使用Encoding將任意數據處理爲字符串。別擔心,我看到這個很多(因此this post)。

文本編碼的目的是:

string  =>  byte[]  =>  string 
     (encode)   (decode) 

重要位置的事情是,byte[]具有由編碼定義的特定重要。你想要的是基64:

byte[]  =>  string  =>  byte[] 
     (encode)   (decode) 

你做經:

byte[] raw = ms.ToArray(); 
string s = Convert.ToBase64String(raw); 

然後:

byte[] bytes = Convert.FromBase64String(s);