.NET nesnelerini serileştirmenin ve serisini kaldırmanın en hızlı yolu


88

.NET nesnelerini serileştirmenin ve serisini kaldırmanın en hızlı yolunu arıyorum. Şimdiye kadar sahip olduğum şeyler:

public class TD
{
    public List<CT> CTs { get; set; }
    public List<TE> TEs { get; set; }
    public string Code { get; set; }
    public string Message { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }

    public static string Serialize(List<TD> tData)
    {
        var serializer = new XmlSerializer(typeof(List<TD>));

        TextWriter writer = new StringWriter();
        serializer.Serialize(writer, tData);

        return writer.ToString();
    }

    public static List<TD> Deserialize(string tData)
    {
        var serializer = new XmlSerializer(typeof(List<TD>));

        TextReader reader = new StringReader(tData);

        return (List<TD>)serializer.Deserialize(reader);
    }        
}

2
Performans mı yoksa kod ayak izi mi?
ulrichb

Performans verilerine veya koda ihtiyacım olup olmadığını mı soruyorsunuz?
41'de aron

3
"En hızlı şekilde" performans açısından mı yoksa kod ayak izi açısından mı kastettiğinizi soruyor. BinaryFormatterkod ve uygulama açısından son derece hızlıdır, ancak Marc'ınki gibi bir çözüm kıyaslamada daha hızlı performans gösterecektir.
Cody Grey

Tamam, anlıyorum, ben ... performans açısından anlamı
aron

Orada birçok bağlantı var. Bunlardan biri: blogs.msdn.com/b/youssefm/archive/2009/07/10/…
nawfal

Yanıtlar:


58

İşte modeliniz (icat edilmiş CTve TE) protobuf-net kullanan (yine XmlSerializerde yararlı olabilecek, özellikle taşıma için kullanma yeteneğini koruyan ); (Eğer gerekirse delil dolu) naçizane bu olduğunu teslim olduğu en hızlı (veya en hızlı kesinlikle biri) .NET genel amaçlı seri hale.

Dizelere ihtiyacınız varsa, ikiliyi temel 64 kodlayın.

[XmlType]
public class CT {
    [XmlElement(Order = 1)]
    public int Foo { get; set; }
}
[XmlType]
public class TE {
    [XmlElement(Order = 1)]
    public int Bar { get; set; }
}
[XmlType]
public class TD {
    [XmlElement(Order=1)]
    public List<CT> CTs { get; set; }
    [XmlElement(Order=2)]
    public List<TE> TEs { get; set; }
    [XmlElement(Order = 3)]
    public string Code { get; set; }
    [XmlElement(Order = 4)]
    public string Message { get; set; }
    [XmlElement(Order = 5)]
    public DateTime StartDate { get; set; }
    [XmlElement(Order = 6)]
    public DateTime EndDate { get; set; }

    public static byte[] Serialize(List<TD> tData) {
        using (var ms = new MemoryStream()) {
            ProtoBuf.Serializer.Serialize(ms, tData);
            return ms.ToArray();
        }            
    }

    public static List<TD> Deserialize(byte[] tData) {
        using (var ms = new MemoryStream(tData)) {
            return ProtoBuf.Serializer.Deserialize<List<TD>>(ms);
        }
    }
}

2
İyi günler Marc, yaptığın protokol arabellek çalışmalarını seviyorum ve bu yazının neredeyse 5 yıl eski olduğunu biliyorum ama burada bir cevapta (Binoj) alıntılanan netserializer, uygulamanızın en hızlı olmadığını gösteren ölçümlere sahip. Bu adil bir açıklama / reklam mı yoksa bir değiş tokuş var mı? teşekkürler
Jeremy Thompson

tamam Şimdi anlıyorum, NetSerialization yalnızca Sürüm Toleranslı Serileştirmeyi aradığım aynı sürüm için çalışıyor
Jeremy Thompson

1
Bunun hızlı olduğunu düşünen biri bir şeyler içiyor olmalı, birçok vaka için yeterince hızlı olabilir ve piyasadaki diğer serilerden daha hızlı olabilir, ancak elle ayrıştırmaya kıyasla gerçekten hızlı mı? Tanrım hayır.
BjarkeCK

@BjarkeCK serileştiricileri doğaları gereği biraz daha ilgili, çünkü insanların kendi ayaklarını fırlatmasını önlemek için birçok şey yapmaları gerekiyor (özellikle sürümleri yineledikçe); çoğu insan hayatlarını serileştirme kodunda hata ayıklamak istemez, bu nedenle: iyi bir serileştirici - mükemmel bir şekilde uygulanan sürüme toleranssız manuel uygulamadan şüphesiz daha yavaş olsa da - çoğu insan için genellikle iyi bir uzlaşmadır.
Marc Gravell

2
@BjarkeCK Kesinlikle katılmıyorum; bu çoğu insan için uzaktan bile kullanışlı değil . Sırada ne var - her gün kendi koleksiyonumuzu yazmak mı? Hayır: Bunları makul derecede iyi yapmak bile zor . Elbette, gerçekten en hızlı çıktıya ihtiyacınız varsa: ellerinizi kirletmeniz gerekecek - ancak çoğu insan için bunu yapmak gerçekten çok kötü bir zaman kaybı olur. EN İYİ DURUMDA, çok daha uzun sürerdi. Büyük olasılıkla, kodları hatalı, güvenilmez ve muhtemelen mevcut kitaplıkları kullanmaktan daha yavaş olacaktır. Çoğu kişi , uygulamalarının ihtiyaç duyduğu şeylere odaklanmalıdır, bu ayrıntılara değil.
Marc Gravell

34

Bu yazıda benim tarafımdan yapılan farklı formatlar arasında kapsamlı bir karşılaştırma- https://maxondev.com/serialization-performance-comparison-c-net-formats-frameworks-xmldatacontractserializer-xmlserializer-binaryformatter-json-newtonsoft-servicestack-text/

Gönderiden sadece bir örnek- görüntü açıklamasını buraya girin


6
Bu hız değil. Bu yavaşlıktır. Bağlantılı makalede "küçük daha iyidir" yazıyor.
Timur Nuriyasov

2
@TimurNuriyasov, operasyonu yapmak için gereken süre bu
Maxim

2
Yani ikilinin en yavaş olduğunu mu söylüyorsunuz? Ben öyle düşünmüyorum! Sanırım doğru bir şekilde hıza atıfta bulunuyor, zamanı değil.
Javid

2
İkili, en yavaş olanıdır. Kendinizi deneyin. Ama bunun polimorfik nesneleri (arayüzler, vs) ile düzgün çalışması için malzeme çözülmesi herhangi özel gerektirmez gibi, en kolay olduğunu söyleyebilirim
Kamarey

1
Aşağıda ... ikili benim testte @Kamarey bakmak yolu diğerlerinden daha hızlı.
Jeremy Holovacs

20

Buna ilgi duyarak önerilen yöntemleri, yapabileceğim en yakın "elmadan elmaya" testi ile test etmeye karar verdim. Aşağıdaki kodla bir Konsol uygulaması yazdım:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;

namespace SerializationTests
{
    class Program
    {
        static void Main(string[] args)
        {
            var count = 100000;
            var rnd = new Random(DateTime.UtcNow.GetHashCode());
            Console.WriteLine("Generating {0} arrays of data...", count);
            var arrays = new List<int[]>();
            for (int i = 0; i < count; i++)
            {
                var elements = rnd.Next(1, 100);
                var array = new int[elements];
                for (int j = 0; j < elements; j++)
                {
                    array[j] = rnd.Next();
                }   
                arrays.Add(array);
            }
            Console.WriteLine("Test data generated.");
            var stopWatch = new Stopwatch();

            Console.WriteLine("Testing BinarySerializer...");
            var binarySerializer = new BinarySerializer();
            var binarySerialized = new List<byte[]>();
            var binaryDeserialized = new List<int[]>();

            stopWatch.Reset();
            stopWatch.Start();
            foreach (var array in arrays)
            {
                binarySerialized.Add(binarySerializer.Serialize(array));
            }
            stopWatch.Stop();
            Console.WriteLine("BinaryFormatter: Serializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds);

            stopWatch.Reset();
            stopWatch.Start();
            foreach (var serialized in binarySerialized)
            {
                binaryDeserialized.Add(binarySerializer.Deserialize<int[]>(serialized));
            }
            stopWatch.Stop();
            Console.WriteLine("BinaryFormatter: Deserializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds);


            Console.WriteLine();
            Console.WriteLine("Testing ProtoBuf serializer...");
            var protobufSerializer = new ProtoBufSerializer();
            var protobufSerialized = new List<byte[]>();
            var protobufDeserialized = new List<int[]>();

            stopWatch.Reset();
            stopWatch.Start();
            foreach (var array in arrays)
            {
                protobufSerialized.Add(protobufSerializer.Serialize(array));
            }
            stopWatch.Stop();
            Console.WriteLine("ProtoBuf: Serializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds);

            stopWatch.Reset();
            stopWatch.Start();
            foreach (var serialized in protobufSerialized)
            {
                protobufDeserialized.Add(protobufSerializer.Deserialize<int[]>(serialized));
            }
            stopWatch.Stop();
            Console.WriteLine("ProtoBuf: Deserializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds);

            Console.WriteLine();
            Console.WriteLine("Testing NetSerializer serializer...");
            var netSerializerSerializer = new ProtoBufSerializer();
            var netSerializerSerialized = new List<byte[]>();
            var netSerializerDeserialized = new List<int[]>();

            stopWatch.Reset();
            stopWatch.Start();
            foreach (var array in arrays)
            {
                netSerializerSerialized.Add(netSerializerSerializer.Serialize(array));
            }
            stopWatch.Stop();
            Console.WriteLine("NetSerializer: Serializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds);

            stopWatch.Reset();
            stopWatch.Start();
            foreach (var serialized in netSerializerSerialized)
            {
                netSerializerDeserialized.Add(netSerializerSerializer.Deserialize<int[]>(serialized));
            }
            stopWatch.Stop();
            Console.WriteLine("NetSerializer: Deserializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds);

            Console.WriteLine("Press any key to end.");
            Console.ReadKey();
        }

        public class BinarySerializer
        {
            private static readonly BinaryFormatter Formatter = new BinaryFormatter();

            public byte[] Serialize(object toSerialize)
            {
                using (var stream = new MemoryStream())
                {
                    Formatter.Serialize(stream, toSerialize);
                    return stream.ToArray();
                }
            }

            public T Deserialize<T>(byte[] serialized)
            {
                using (var stream = new MemoryStream(serialized))
                {
                    var result = (T)Formatter.Deserialize(stream);
                    return result;
                }
            }
        }

        public class ProtoBufSerializer
        {
            public byte[] Serialize(object toSerialize)
            {
                using (var stream = new MemoryStream())
                {
                    ProtoBuf.Serializer.Serialize(stream, toSerialize);
                    return stream.ToArray();
                }
            }

            public T Deserialize<T>(byte[] serialized)
            {
                using (var stream = new MemoryStream(serialized))
                {
                    var result = ProtoBuf.Serializer.Deserialize<T>(stream);
                    return result;
                }
            }
        }

        public class NetSerializer
        {
            private static readonly NetSerializer Serializer = new NetSerializer();
            public byte[] Serialize(object toSerialize)
            {
                return Serializer.Serialize(toSerialize);
            }

            public T Deserialize<T>(byte[] serialized)
            {
                return Serializer.Deserialize<T>(serialized);
            }
        }
    }
}

Sonuçlar beni şaşırttı; birden çok kez çalıştırıldıklarında tutarlıydılar:

Generating 100000 arrays of data...
Test data generated.
Testing BinarySerializer...
BinaryFormatter: Serializing took 336.8392ms.
BinaryFormatter: Deserializing took 208.7527ms.

Testing ProtoBuf serializer...
ProtoBuf: Serializing took 2284.3827ms.
ProtoBuf: Deserializing took 2201.8072ms.

Testing NetSerializer serializer...
NetSerializer: Serializing took 2139.5424ms.
NetSerializer: Deserializing took 2113.7296ms.
Press any key to end.

Bu sonuçları toplayarak ProtoBuf veya NetSerializer'ın daha büyük nesnelerle daha iyi performans gösterip göstermediğini görmeye karar verdim. Koleksiyon sayısını 10.000 nesneye değiştirdim, ancak dizilerin boyutunu 1-100 yerine 1-10.000'e çıkardım. Sonuçlar daha da kesin görünüyordu:

Generating 10000 arrays of data...
Test data generated.
Testing BinarySerializer...
BinaryFormatter: Serializing took 285.8356ms.
BinaryFormatter: Deserializing took 206.0906ms.

Testing ProtoBuf serializer...
ProtoBuf: Serializing took 10693.3848ms.
ProtoBuf: Deserializing took 5988.5993ms.

Testing NetSerializer serializer...
NetSerializer: Serializing took 9017.5785ms.
NetSerializer: Deserializing took 5978.7203ms.
Press any key to end.

Bu nedenle, sonucum şu: ProtoBuf ve NetSerializer'ın uygun olduğu durumlar olabilir, ancak en azından nispeten basit nesneler için ham performans açısından ... BinaryFormatter, en azından bir büyüklük sırasına göre önemli ölçüde daha performanslı.

YMMV.


1
belki BinaryFormatter dizilerle gerçekten hızlıdır.
Behrooz

4
Mümkün ... ama belirtilen koşullar altında sonuçlar çarpıcıydı. Buradan alınacak ders şu olabilir, her koşulda tek bir yöntemin en yüksek performanslı olduğuna inanmayın. Test ve kıyaslama her zaman aydınlatıcıdır.
Jeremy Holovacs

C ++ 'da nesne serileştirme yaklaşık 100 kat daha hızlıdır!
Mario M

Çok ilginç! Herkes protobuf'un en hızlı olduğunu iddia etti ama bu acı verici derecede yavaş olduğunu açıkça gösteriyor. Buradaki karışıma BinaronSerializer'ımı ekledim dotnetfiddle.net/gOqQ7p - BinaryFormatter'dan neredeyse iki kat daha hızlı, ki bu zaten dizilerde gerçekten çok hızlı.
Zach,

16

Protobuf çok çok hızlıdır.

Bu sistemin performansıyla ilgili ayrıntılı bilgi ve bir uygulama için http://code.google.com/p/protobuf-net/wiki/Performance adresine bakın .


Protobuf kullanmanın herhangi bir sakıncası var mı?
Robert Jeppesen

11
Nesnelerinize açıklama eklemelisiniz. Protobuf, alan adlarını ve türlerini serileştiriciler gibi saklamaz, ancak bunları gerçek türlerinizden alır. Bu, hedef dosyaların çok daha küçük olmasının nedenlerinden biridir. Belgeler tüm bunları açıklıyor. Onu bir süredir kullanıyorum ve hızlı (de) serileştirmeye ve küçük hedef dosyalara ihtiyacınız varsa, protobuf gerçekten gitmenin yoludur.
Pieter van Ginkel

Cevaba eklemek için C # 'da Protobut kullanan herhangi bir tam kaynak kodu örneği?
Kiquenet

O kadar hızlı değil ... Aslında, çok çok çok hızlı serileştiricilere kıyasla oldukça yavaş: dotnetfiddle.net/gOqQ7p
Zach,

@ZachSaw, sadece tamsayı dizileriyle uğraşıyorsanız o kadar hızlı değildir (örneğiniz), ancak çok az insan yalnızca tam sayıları serileştiriyor. Çok sayıda üyesi olan iç içe geçmiş karmaşık türlerle uğraşmaya başladığınızda hız faydalarını görüyorsunuz (veya en azından benim görüyorum).
matt.rothmeyer

15

Süper hızlı olduğunu iddia eden bir başka serileştirici de netserializer .

Sitelerinde verilen veriler protobuf'a göre 2x - 4x performans gösteriyor , bunu kendim denemedim, ancak çeşitli seçenekleri değerlendiriyorsanız, bunu da deneyin


3
Uygulamamda NetSerializer'ı yeni denedim ve harikalar yaratıyor. Denemeye değer.
Galen

netserializer, kütüphanenin hangi türlerle başlayacağını bilmediği veya hatta kullanıcıyı nesnelerini serileştirilebilir olarak işaretlemeye zorlama seçeneğine sahip olduğu "kullanıcı" nesnelerini serileştirmek için uygun değildir.
Zach,

6

.Net ile birlikte gelen ikili serileştirici, XmlSerializer'dan daha hızlı olmalıdır. Veya protobuf için başka bir serileştirici, json, ...

Ancak bazıları için Öznitelikler eklemeniz veya meta verileri eklemenin başka bir yolunu eklemeniz gerekir. Örneğin, ProtoBuf dahili olarak sayısal özellik kimliklerini kullanır ve eşlemenin bir şekilde farklı bir mekanizma tarafından korunması gerekir. Sürüm oluşturma, herhangi bir serileştirici ile önemsiz değildir.


Evet, gerçekten çok hızlı ve Xml olandan çok daha fazla vakayı / türü işliyor.
leppie

1

Yukarıdaki koddaki hataları kaldırdım ve aşağıdaki sonuçlara ulaştım: Ayrıca NetSerializer'ın serileştirdiğiniz türleri kaydetmenizi nasıl gerektirdiğinden, ne tür uyumluluk veya performans farklılıklarının yaratabileceği konusunda emin değilim.

Generating 100000 arrays of data...
Test data generated.
Testing BinarySerializer...
BinaryFormatter: Serializing took 508.9773ms.
BinaryFormatter: Deserializing took 371.8499ms.

Testing ProtoBuf serializer...
ProtoBuf: Serializing took 3280.9185ms.
ProtoBuf: Deserializing took 3190.7899ms.

Testing NetSerializer serializer...
NetSerializer: Serializing took 427.1241ms.
NetSerializer: Deserializing took 78.954ms.
Press any key to end.

Değiştirilmiş Kod

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;

namespace SerializationTests
{
    class Program
    {
        static void Main(string[] args)
        {
            var count = 100000;
            var rnd = new Random((int)DateTime.UtcNow.Ticks & 0xFF);
            Console.WriteLine("Generating {0} arrays of data...", count);
            var arrays = new List<int[]>();
            for (int i = 0; i < count; i++)
            {
                var elements = rnd.Next(1, 100);
                var array = new int[elements];
                for (int j = 0; j < elements; j++)
                {
                    array[j] = rnd.Next();
                }
                arrays.Add(array);
            }
            Console.WriteLine("Test data generated.");
            var stopWatch = new Stopwatch();

            Console.WriteLine("Testing BinarySerializer...");
            var binarySerializer = new BinarySerializer();
            var binarySerialized = new List<byte[]>();
            var binaryDeserialized = new List<int[]>();

            stopWatch.Reset();
            stopWatch.Start();
            foreach (var array in arrays)
            {
                binarySerialized.Add(binarySerializer.Serialize(array));
            }
            stopWatch.Stop();
            Console.WriteLine("BinaryFormatter: Serializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds);

            stopWatch.Reset();
            stopWatch.Start();
            foreach (var serialized in binarySerialized)
            {
                binaryDeserialized.Add(binarySerializer.Deserialize<int[]>(serialized));
            }
            stopWatch.Stop();
            Console.WriteLine("BinaryFormatter: Deserializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds);


            Console.WriteLine();
            Console.WriteLine("Testing ProtoBuf serializer...");
            var protobufSerializer = new ProtoBufSerializer();
            var protobufSerialized = new List<byte[]>();
            var protobufDeserialized = new List<int[]>();

            stopWatch.Reset();
            stopWatch.Start();
            foreach (var array in arrays)
            {
                protobufSerialized.Add(protobufSerializer.Serialize(array));
            }
            stopWatch.Stop();
            Console.WriteLine("ProtoBuf: Serializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds);

            stopWatch.Reset();
            stopWatch.Start();
            foreach (var serialized in protobufSerialized)
            {
                protobufDeserialized.Add(protobufSerializer.Deserialize<int[]>(serialized));
            }
            stopWatch.Stop();
            Console.WriteLine("ProtoBuf: Deserializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds);

            Console.WriteLine();
            Console.WriteLine("Testing NetSerializer serializer...");
            var netSerializerSerialized = new List<byte[]>();
            var netSerializerDeserialized = new List<int[]>();

            stopWatch.Reset();
            stopWatch.Start();
            var netSerializerSerializer = new NS();
            foreach (var array in arrays)
            {
                netSerializerSerialized.Add(netSerializerSerializer.Serialize(array));
            }
            stopWatch.Stop();
            Console.WriteLine("NetSerializer: Serializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds);

            stopWatch.Reset();
            stopWatch.Start();
            foreach (var serialized in netSerializerSerialized)
            {
                netSerializerDeserialized.Add(netSerializerSerializer.Deserialize<int[]>(serialized));
            }
            stopWatch.Stop();
            Console.WriteLine("NetSerializer: Deserializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds);

            Console.WriteLine("Press any key to end.");
            Console.ReadKey();
        }

        public class BinarySerializer
        {
            private static readonly BinaryFormatter Formatter = new BinaryFormatter();

            public byte[] Serialize(object toSerialize)
            {
                using (var stream = new MemoryStream())
                {
                    Formatter.Serialize(stream, toSerialize);
                    return stream.ToArray();
                }
            }

            public T Deserialize<T>(byte[] serialized)
            {
                using (var stream = new MemoryStream(serialized))
                {
                    var result = (T)Formatter.Deserialize(stream);
                    return result;
                }
            }
        }

        public class ProtoBufSerializer
        {
            public byte[] Serialize(object toSerialize)
            {
                using (var stream = new MemoryStream())
                {
                    ProtoBuf.Serializer.Serialize(stream, toSerialize);
                    return stream.ToArray();
                }
            }

            public T Deserialize<T>(byte[] serialized)
            {
                using (var stream = new MemoryStream(serialized))
                {
                    var result = ProtoBuf.Serializer.Deserialize<T>(stream);
                    return result;
                }
            }
        }

        public class NS
        {
            NetSerializer.Serializer Serializer = new NetSerializer.Serializer(new Type[] { typeof(int), typeof(int[]) });

            public byte[] Serialize(object toSerialize)
            {
                using (var stream = new MemoryStream())
                {
                    Serializer.Serialize(stream, toSerialize);
                    return stream.ToArray();
                }
            }

            public T Deserialize<T>(byte[] serialized)
            {
                using (var stream = new MemoryStream(serialized))
                {
                    Serializer.Deserialize(stream, out var result);
                    return (T)result;
                }
            }
        }
    }
}

1
Hangi böceklerden bahsediyorsun?
Jeremy Holovacs

0

Salar.Bois'i deneyebilirsiniz .İyi bir performansa sahip olan serileştiriciyi . Odak noktası yük boyutudur, ancak aynı zamanda iyi bir performans sunar.

Sonuçları kendiniz görmek ve karşılaştırmak isterseniz Github sayfasında kriterler vardır.

https://github.com/salarcode/Bois


0

Sınıflarınızı CGbR jeneratörüne besleme özgürlüğünü aldım .Erken bir aşamada olduğu için DateTimehenüz desteklemiyor , bu yüzden basitçe onu long ile değiştirdim. Üretilen serileştirme kodu şuna benzer:

public int Size
{
    get 
    { 
        var size = 24;
        // Add size for collections and strings
        size += Cts == null ? 0 : Cts.Count * 4;
        size += Tes == null ? 0 : Tes.Count * 4;
        size += Code == null ? 0 : Code.Length;
        size += Message == null ? 0 : Message.Length;

        return size;              
    }
}

public byte[] ToBytes(byte[] bytes, ref int index)
{
    if (index + Size > bytes.Length)
        throw new ArgumentOutOfRangeException("index", "Object does not fit in array");

    // Convert Cts
    // Two bytes length information for each dimension
    GeneratorByteConverter.Include((ushort)(Cts == null ? 0 : Cts.Count), bytes, ref index);
    if (Cts != null)
    {
        for(var i = 0; i < Cts.Count; i++)
        {
            var value = Cts[i];
            value.ToBytes(bytes, ref index);
        }
    }
    // Convert Tes
    // Two bytes length information for each dimension
    GeneratorByteConverter.Include((ushort)(Tes == null ? 0 : Tes.Count), bytes, ref index);
    if (Tes != null)
    {
        for(var i = 0; i < Tes.Count; i++)
        {
            var value = Tes[i];
            value.ToBytes(bytes, ref index);
        }
    }
    // Convert Code
    GeneratorByteConverter.Include(Code, bytes, ref index);
    // Convert Message
    GeneratorByteConverter.Include(Message, bytes, ref index);
    // Convert StartDate
    GeneratorByteConverter.Include(StartDate.ToBinary(), bytes, ref index);
    // Convert EndDate
    GeneratorByteConverter.Include(EndDate.ToBinary(), bytes, ref index);
    return bytes;
}

public Td FromBytes(byte[] bytes, ref int index)
{
    // Read Cts
    var ctsLength = GeneratorByteConverter.ToUInt16(bytes, ref index);
    var tempCts = new List<Ct>(ctsLength);
    for (var i = 0; i < ctsLength; i++)
    {
        var value = new Ct().FromBytes(bytes, ref index);
        tempCts.Add(value);
    }
    Cts = tempCts;
    // Read Tes
    var tesLength = GeneratorByteConverter.ToUInt16(bytes, ref index);
    var tempTes = new List<Te>(tesLength);
    for (var i = 0; i < tesLength; i++)
    {
        var value = new Te().FromBytes(bytes, ref index);
        tempTes.Add(value);
    }
    Tes = tempTes;
    // Read Code
    Code = GeneratorByteConverter.GetString(bytes, ref index);
    // Read Message
    Message = GeneratorByteConverter.GetString(bytes, ref index);
    // Read StartDate
    StartDate = DateTime.FromBinary(GeneratorByteConverter.ToInt64(bytes, ref index));
    // Read EndDate
    EndDate = DateTime.FromBinary(GeneratorByteConverter.ToInt64(bytes, ref index));

    return this;
}

Bunun gibi örnek nesnelerin bir listesini oluşturdum:

var objects = new List<Td>();
for (int i = 0; i < 1000; i++)
{
    var obj = new Td
    {
        Message = "Hello my friend",
        Code = "Some code that can be put here",
        StartDate = DateTime.Now.AddDays(-7),
        EndDate = DateTime.Now.AddDays(2),
        Cts = new List<Ct>(),
        Tes = new List<Te>()
    };
    for (int j = 0; j < 10; j++)
    {
        obj.Cts.Add(new Ct { Foo = i * j });
        obj.Tes.Add(new Te { Bar = i + j });
    }
    objects.Add(obj);
}

Yapımdaki makinemdeki sonuçlar Release:

var watch = new Stopwatch();
watch.Start();
var bytes = BinarySerializer.SerializeMany(objects);
watch.Stop();

Boyut: 149000 bayt

Zaman: 2,059 ms 3,13 ms

Düzenleme: CGbR 0.4.3 ile başlayarak ikili serileştirici DateTime'ı destekler. Maalesef DateTime.ToBinaryyöntem delice yavaş. Yakında daha hızlı bir şekilde değiştireceğim.

Edit2: UTC kullanırken DateTimeçağırarak ToUniversalTime()performansı geri yüklenir ve saatler içinde en 1.669ms .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.