序列化之Apache Thrift


Apache Thrift和ProtoBuf一樣,都是為優化序列化而生,Thrift是一個通信框架,最初有FaceBook開發,后交由Apache管理,目前Facebook也在使用。Thrift與ProtoBuf同樣是跨平台多語言的,不過Thrift幾乎支持現下的所有流行的語言,而ProtoBuf.net是.net的移植,相比而來Thrift支持更廣。我這里做的是對Thrift序列化數據在效率做實驗

1.定義接口文件

相當於數據契約。Thrift的契約定義用了自己的一套語法(IDL),這樣做的目的是讓他可以跨語言,同一套契約可以在任何語言下使用,關於IDL方法可以去參考Thrift的白皮書

和上一篇文章相同,有以下這樣兩個類

public class Person
    {
        public int Id { get; set; }]
        public string Name { get; set; }
        public Address Address { get; set; }
    }


    public class Address
    {
        public string Line1 { get; set; }
        public string Line2 { get; set; }
    }

用Thrift 的IDL語言定義后如下,文件保存為test.idl

struct Address
{
        1: string Line1,
        2: string Line2
}
struct Person
{
        1: i32 Id,
        2: string Name,
        3: Address Address
}

2. 使用Thrift提供的windows編譯器生成文件

使用thrift-0.9.1.exe生成文件,將test.idl與thrift-0.9.1.exe放在同級目錄下,在控制台是執行命令

thrift-0.9.1 --gen csharp test.idl

文件生成在目錄下的gen-csharp文件夾中

Address.cs

Person.cs

 

3. 添加Thrift.dll

下載thrift-0.9.1.tar.gz解壓后找到對應的C#代碼編譯后就得到Thrift.dll了

捕獲

4. 序列化數據

創建一個C#控制台應用程序,將生成的兩個代碼文件添加到項目中,再添加Thrift.dll引用,和上次一樣序列化同樣的1000條數據,得到的數據大小為48.7 KB (49,890 字節)

    class Program
    {
        static void Main(string[] args)
        {
            Person person = new Person { Address = new Address { Line1 = "Line1", Line2 = "Line2" }, Id = 1, Name = "Name" };
            using (System.IO.Stream stream = System.IO.File.Create("Person.dat"))
            {
                Thrift.Transport.TTransport transport = new Thrift.Transport.TStreamTransport(null,stream);
                Thrift.Protocol.TProtocol protocol = new Thrift.Protocol.TBinaryProtocol(transport);
                List<Person> list = new List<Person>();
                for (int i = 0; i < 1000; i++)
                {
                    Person item = new Person { Address = new Address { Line1 = "Line1", Line2 = "Line2" }, Id = i, Name = "Name" + i };
                    item.Write(protocol);
                }
            }

        }
    }

Demo下載

對比上次的ProtoBuf大了不少,和C#的原始二進制序列化只差5kb。當然我這次對比幾個數據也不能說明什么問題,只能做個大概了解。網絡通信是個復雜的過程。序列化數據大小直接影響網絡帶寬,序列化與反序列化的效率也直接影響着服務器資源。當數據量大小上升到不同數量級時ProtoBuf和Thrift到底誰更占上風我就法驗證了。

Thrift是個網絡通信框架,提供了多種數據序列化方式,並且支持多種語言,通過Thrift的IDL語言定義過的契約可以在所有支持的語言上使用,且與平台無關,這就是他NB的地方。從Thrift的Tutorial看來對現將通信協議遷移也不是件事。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM