2011-08-17 70 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);