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>
原型结果
这是我的代码。
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 是一个 binary 协议;它是 不是 文本,特别不是 UTF8。当输入数据不是 UTF-8 缓冲区时,您正在尝试将 解码 UTF-8 缓冲区转换为字符串。
如果您想将原始 byte[]
变成 string
,那么 Convert.ToBase64String
是您的朋友。但是如果你可以避免这样做:如果可能,最好将其视为二进制端到端。
作为一件非常小的事情:这里不需要调用 ToArray()
- 这会强制执行额外的数组副本。如果可能,使用 GetBuffer()
结合 .Length
(底层缓冲区过大);即
string base64 = Convert.ToBase64String(
protoStream.GetBuffer(), 0, (int)protoStream.Length);
我目前正在做一个 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>
原型结果
这是我的代码。
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 是一个 binary 协议;它是 不是 文本,特别不是 UTF8。当输入数据不是 UTF-8 缓冲区时,您正在尝试将 解码 UTF-8 缓冲区转换为字符串。
如果您想将原始 byte[]
变成 string
,那么 Convert.ToBase64String
是您的朋友。但是如果你可以避免这样做:如果可能,最好将其视为二进制端到端。
作为一件非常小的事情:这里不需要调用 ToArray()
- 这会强制执行额外的数组副本。如果可能,使用 GetBuffer()
结合 .Length
(底层缓冲区过大);即
string base64 = Convert.ToBase64String(
protoStream.GetBuffer(), 0, (int)protoStream.Length);