繁体   English   中英

Protobuf-net-仅序列化一些属性

[英]Protobuf-net - Serialize only a few properties

是否可以仅序列化该类的几个属性? 例如:

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:对不起,英语不好

它是。 只要确保在类中包含[ProtoContract]属性,并在序列化和反序列化时使用完全相同的协定即可。

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

文本编码的目的是:

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

问题是由于编码。 您为什么要阅读流,然后创建另一个流? 这样的事情应该起作用:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM