繁体   English   中英

Protobuf-net序列化创建十六进制字符

[英]Protobuf-net Serialize creating hex characters

我目前正在做POC,以证明Protobuf-net比本机C#序列化器更快。 但是我遇到错误了吗? 关于序列化响应。

这是错误

nativeResult

<?xml version="1.0"?>
<userInformation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <age>22</age>
  <education>Cavite State University</education>
  <name>Ronald Estacion</name>
  <address>
    <city>Cavite</city>
    <country>PH</country>
    <street>Torjak Street</street>
    <subd>Yari ka ngayon</subd>
  </address>
</userInformation>

protoresult

原

这是我的代码。

var nativeSerializer = new XmlSerializer(typeof(UserInformation));
var nativeStream = new MemoryStream();
var protoStream = new MemoryStream();
nativeSerializer.Serialize(nativeStream, CreateDetaulUserInformation());
var nativeResult = Encoding.UTF8.GetString(nativeStream.ToArray());
Serializer.Serialize(protoStream, CreateDetaulUserInformation());
var protoResult = Encoding.UTF8.GetString(protoStream.ToArray());

这是UserInformation对象。

//[ProtoContract]
[XmlType("address")]
public class Address
{
    //[ProtoMember(1)]
    [XmlElement("city", Order = 1)]
    public string City { get; set; }

    //[ProtoMember(2)]
    [XmlElement("country", Order = 2)]
    public string Country { get; set; }

    //[ProtoMember(3)]
    [XmlElement("street", Order = 3)]
    public string Street { get; set; }

    //[ProtoMember(4)]
    [XmlElement("subd", Order = 4)]
    public string Subdivision { get; set; }
}

//[ProtoContract]
[XmlType("userInformation")]
public class UserInformation
{
    //[ProtoMember(1)]
    [XmlElement("age", Order = 1)]
    public int Age { get; set; }

    //[ProtoMember(2)]
    [XmlElement("education", Order = 2)]
    public string Education { get; set; }

    //[ProtoMember(3)]
    [XmlElement("name", Order = 3)]
    public string Name { get; set; }

    //[ProtoMember(4)]
    [XmlElement("address", Order = 4)]
    public Address Address { get; set; }
}

注意:我也尝试过使用ProtoContract作为属性,但结果相同。 Protobuf-net也支持XmlType因此我评论了这些属性。

这是您的错误:

var protoResult = Encoding.UTF8.GetString(protoStream.ToArray());

protobuf是二进制协议; 不是文本,特别是不是UTF8。 当输入数据不是UTF-8缓冲区时,您正在尝试将UTF-8缓冲区解码为字符串。

如果要将原始byte[]转换为string ,那么Convert.ToBase64String是您的朋友。 但是,如果你避免这样做:最好是把它当作二进制端至端如果可能的话。

作为一个非常小的事情:这里不需要调用ToArray() -这会强制执行额外的数组副本。 如果可能,将GetBuffer() .Length 结合使用 (底层缓冲区过大);

string base64 = Convert.ToBase64String(
    protoStream.GetBuffer(), 0, (int)protoStream.Length);

暂无
暂无

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

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