可以仅序列化该类的几个属性吗? 例如:
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:对不起英语很差
答案 0 :(得分:2)
是的。只需确保包含类的[ProtoContract]属性,并在序列化和反序列化时使用完全相同的合同。
答案 1 :(得分: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);
答案 2 :(得分: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);