2015-04-01 32 views
1

目前,我正在做一個POC證明protobuf網是比原生的C#串行更快。但是我遇到了一個錯誤?在序列化響應上。protobuf網序列化創建的十六進制字符

以下是錯誤

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

Proto

這裏是我的代碼。

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網支持XmlType以及我評論這些屬性。

+0

什麼是你的XML文件的編碼? – jhenninger 2015-04-01 03:49:35

+0

你稱爲「本地C#序列化程序」是NET XML序列化程序。輸出是XML(文本)。 ProtoBuf是一個*二進制*串行器。你正在比較蘋果和西紅柿。不可打印的主要字符是22(年齡)的序列化二進制表示。一切都按照它應有的方式工作。將NET BinaryFormatter的輸出與ProtoBuf進行比較以獲得更類似的比較結果。 – Plutonix 2015-04-01 04:38:19

+0

@Plutonix我如何實現一個xml字符串輸出? – DevEstacion 2015-04-01 05:28:28

回答

1

這是你的錯誤:

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

的問題是,我們有一個傳統的web服務,它接受XML請求和XML響應,所以我是找到一種方法,使更快序列化/反序列化xmls – DevEstacion 2015-04-02 01:04:58

+0

@DevEstacion protobuf-net不是*一個xml序列化器;它會說「protobuf」 – 2015-04-02 06:59:17

+0

♦正如我想的那樣,我只是想知道如果我可以使用它的反序列化和序列化速度爲xml。謝謝。 – DevEstacion 2015-04-02 07:01:03

相關問題