Protobuf-net - 仅序列化几个属性

Posted

技术标签:

【中文标题】Protobuf-net - 仅序列化几个属性【英文标题】:Protobuf-net - Serialize only a few properties 【发布时间】:2011-08-17 22:29:14 【问题描述】:

可以只序列化类的几个属性吗? 例如:

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 以执行任务。及时扭转这种转换,我的 Id 值有误


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

我的转换有误?

Obs:对不起英语不好

【问题讨论】:

(我是 protobuf-net 的作者)编写的类很好(只要您添加 [ProtoContract],正如 alfonso 所建议的那样)。请澄清您所说的““Id”的值不正确”是什么意思-您看到了什么? (在您的编辑中添加了答案) 【参考方案1】:

是的。只需确保为类包含 [ProtoContract] 属性,并在序列化和反序列化时使用完全相同的合约。

【讨论】:

José,如果没有看到您的代码,就无法为您提供帮助。在此处粘贴您的一些代码,以便人们可以看到您要执行的操作。如果您的问题与该问题无关,则应创建另一个问题以避免混淆。【参考方案2】:

通过您的编辑,错误很明显;您正在使用 Encoding 将任意数据处理成字符串。别担心,我看到这个很多(因此this post)。

文本编码的目的是:

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

这里重要的是byte[] 具有由编码定义的特定重要性。你想要的是base-64:

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

你是通过什么来做的:

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

然后:

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

【讨论】:

【参考方案3】:

问题在于编码。你为什么要阅读流然后创建另一个流?这样的事情应该可以工作:

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

【讨论】:

因为我把Stream转成String,String在一些流程中使用,然后转回pro对象。 您应该考虑使用 Stream 而不是将其转换为字符串。它们是完全不同的概念。但是,我认为您可以通过在 StreamReader 构造函数中指示 UTF8 编码来解决您的问题: new StreamReader(ms, System.Text.Encoding.UTF8) 我测试了这段代码,错误仍然存​​在。我需要转换为字符串,因为我做了一些涉及数据库和其他业务规则的操作。 这个人需要和你做同样的事情。看看答案。看来你应该使用 Convert.ToBase64String: ***.com/questions/6905585/…

以上是关于Protobuf-net - 仅序列化几个属性的主要内容,如果未能解决你的问题,请参考以下文章

protobuf-net:反序列化 Guid 属性的错误线型异常

protobuf-net 不使用私有设置器序列化 C# 属性

是否可以在 Silverlight 中使用 protobuf-net 对私有属性进行(反)序列化?

我可以反序列化为 protobuf-net 中接口的只读属性吗?

Protobuf-net - 啥被序列化了?

Protobuf-Net:如何序列化 guid?