国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

protobuf-net 與 C#中幾種序列化的比較

2019-11-17 02:48:40
字體:
來源:轉載
供稿:網友

PRotobuf-net 與 C#中幾種序列化的比較

C#中幾種序列化的比較,此次比較只是比較了 序列化的耗時和序列后文件的大小。

幾種序列化分別是:

1.xmlSerializer

2.BinaryFormatter

3.DataContractSerializer

4.DataContractJsonSerializer

5.protobuf-net

前四種為.Net 自帶的類庫,最后一種為 GoogleProtocol Buffers

首先,選做一個實體類,做為序列化的對象,加入了一個可序列化的字典,讓實體類 稍稍的復雜一點。

Code:

    [Serializable]    [ProtoContract]    public class User    {        [ProtoMember(1)]        public int ID { get; set; }        [ProtoMember(2)]        public string Name { get; set; }        [ProtoMember(3)]        public int Age { get; set; }        [ProtoMember(4)]        public SerializableDictionary<Guid, Guid> Dictionary { get; set; }    }    [Serializable]    public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable    {        public void WriteXml(XmlWriter write)       // Serializer        {            var keySerializer = new XmlSerializer(typeof(TKey));            var valueSerializer = new XmlSerializer(typeof(TValue));            foreach (KeyValuePair<TKey, TValue> kv in this)            {                write.WriteStartElement("SerializableDictionary");                write.WriteStartElement("key");                keySerializer.Serialize(write, kv.Key);                write.WriteEndElement();                write.WriteStartElement("value");                valueSerializer.Serialize(write, kv.Value);                write.WriteEndElement();                write.WriteEndElement();            }        }        public void ReadXml(XmlReader reader)       // Deserializer        {            reader.Read();            var keySerializer = new XmlSerializer(typeof(TKey));            var valueSerializer = new XmlSerializer(typeof(TValue));            while (reader.NodeType != XmlNodeType.EndElement)            {                reader.ReadStartElement("SerializableDictionary");                reader.ReadStartElement("key");                TKey tk = (TKey)keySerializer.Deserialize(reader);                reader.ReadEndElement();                reader.ReadStartElement("value");                TValue vl = (TValue)valueSerializer.Deserialize(reader);                reader.ReadEndElement();                reader.ReadEndElement();                this.Add(tk, vl);                reader.MoveToContent();            }            reader.ReadEndElement();        }        public XmlSchema GetSchema()        {            return null;        }    }

然后,初始化一個集合,有1000個User對象,每個User對象中的字典,有500對Guid

            var list = new List<User>();            var random = new Random();            for (int i = 0; i < 1000; i++)            {                var id = random.Next(0, 10000);                var user = new User                {                    ID = id,                    Name = "Name" + id,                    Age = random.Next(1, 100)                };                var dic = new SerializableDictionary<Guid, Guid>();                for (int j = 0; j < 500; j++)                {                    dic.Add(Guid.NewGuid(), Guid.NewGuid());                }                user.Dictionary = dic;                list.Add(user);            }

最后,開始序列化,計時用Stopwatch

1. Xml序列化

            Stopwatch sw = new Stopwatch();            //XmlSerializer            sw.Start();            var xmlSerializer = new XmlSerializer(typeof(List<User>));            const string xmlfile = "xml.txt";            var fi = new FileInfo(xmlfile);            using (var stream = fi.Create())            {                xmlSerializer.Serialize(stream, list);            }            sw.Stop();            fi.Refresh();            Console.WriteLine("XML Time : {0} , Size : {1}K", sw.Elapsed, fi.Length / 1024);
View Code

2. 二進制序列化

            //BinarySerializer            sw.Restart();            var binarySerializer = new BinaryFormatter();            const string binaryfile = "binary.txt";            var binaryfi = new FileInfo(binaryfile);            using (var stream = binaryfi.Create())            {                binarySerializer.Serialize(stream, list);            }            sw.Stop();            binaryfi.Refresh();            Console.WriteLine("Binary Time : {0} , Size : {1}K", sw.Elapsed, binaryfi.Length / 1024);
View Code

3.DataContractSerializer

            //DataContractSerializer            sw.Restart();            var dataContractSerializer = new DataContractSerializer(typeof(List<User>));            const string dataContractfile = "dataContract.txt";            var dataContractfi = new FileInfo(dataContractfile);            using (var stream = dataContractfi.Create())            {                dataContractSerializer.WriteObject(stream, list);            }            sw.Stop();            fi.Refresh();            Console.WriteLine("DataContrac Time : {0} , Size : {1}K", sw.Elapsed, dataContractfi.Length / 1024);
View Code

4.DataContractJsonSerializer

            //DataContractJsonSerializer            sw.Restart();            var dataContractJsonSerializer = new DataContractJsonSerializer(typeof(List<User>));            const string dataContractJsonfile = "dataContractJson.txt";            var dataContractJsonfi = new FileInfo(dataContractJsonfile);            using (var stream = dataContractJsonfi.Create())            {                dataContractJsonSerializer.WriteObject(stream, list);            }            sw.Stop();            fi.Refresh();            Console.WriteLine("DataContractJson Time : {0} , Size : {1}K", sw.Elapsed, dataContractJsonfi.Length / 1024);
View Code

5.protobuf-net

            sw.Restart();            //protobuf-net            const string protobuffile = "buffer.txt";            var pbfi = new FileInfo(protobuffile);            using (var stream = pbfi.Create())            {                Serializer.Serialize(stream, list);            }            sw.Stop();            fi.Refresh();            Console.WriteLine("Protobuf-net Time : {0} , Size : {1}K", sw.Elapsed, pbfi.Length / 1024);
View
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 桑日县| 门头沟区| 皮山县| 阿克苏市| 锡林浩特市| 金塔县| 丰台区| 陆河县| 建昌县| 南乐县| 金堂县| 昌黎县| 大城县| 滦平县| 赞皇县| 鸡泽县| 贞丰县| 上思县| 枞阳县| 库尔勒市| 嘉鱼县| 南雄市| 大同市| 本溪| 抚州市| 得荣县| 体育| 卢湾区| 祁阳县| 称多县| 长顺县| 凤庆县| 益阳市| 上饶县| 土默特右旗| 平潭县| 县级市| 兰溪市| 龙门县| 寿光市| 菏泽市|