मैंने CGBR जनरेटर में आपकी कक्षाओं को खिलाने की स्वतंत्रता ली ।क्योंकि यह एक प्रारंभिक चरण में है, यह समर्थन नहीं करता है DateTime
अभी तक है, इसलिए मैंने इसे लंबे समय से बदल दिया। उत्पन्न क्रमांकन कोड इस तरह दिखता है:
public int Size
{
get
{
var size = 24;
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");
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);
}
}
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);
}
}
GeneratorByteConverter.Include(Code, bytes, ref index);
GeneratorByteConverter.Include(Message, bytes, ref index);
GeneratorByteConverter.Include(StartDate.ToBinary(), bytes, ref index);
GeneratorByteConverter.Include(EndDate.ToBinary(), bytes, ref index);
return bytes;
}
public Td FromBytes(byte[] bytes, ref int index)
{
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;
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;
Code = GeneratorByteConverter.GetString(bytes, ref index);
Message = GeneratorByteConverter.GetString(bytes, ref index);
StartDate = DateTime.FromBinary(GeneratorByteConverter.ToInt64(bytes, ref index));
EndDate = DateTime.FromBinary(GeneratorByteConverter.ToInt64(bytes, ref index));
return this;
}
मैंने इस तरह नमूना वस्तुओं की एक सूची बनाई:
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);
}
Release
बिल्ड में मेरी मशीन पर परिणाम :
var watch = new Stopwatch();
watch.Start();
var bytes = BinarySerializer.SerializeMany(objects);
watch.Stop();
आकार: 149000 बाइट्स
समय: 2.059ms 3.13ms
संपादित करें: CGbR 0.4.3 से शुरू होकर बाइनरी सीरियलाइज़र डेटाइम का समर्थन करता है। दुर्भाग्य से DateTime.ToBinary
विधि पागलपनपूर्ण है। मैं इसे शीघ्रता से बदलने का प्रयास करूंगा।
Edit2: जब प्रदर्शन का उपयोग करके UTC का उपयोग DateTime
किया जाता है, ToUniversalTime()
तो इसे पुनर्स्थापित किया जाता है और 1.669ms की घड़ियां होती हैं ।