আমি আপনার ক্লাসগুলিকে সিজিবিআর জেনারেটরে খাওয়ানোর স্বাধীনতা নিয়েছি ।কারণ এটি প্রাথমিক পর্যায়ে এটি 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
সম্পাদনা করুন: সিজিবিআর 0.4.3 দিয়ে শুরু করে বাইনারি সিরিয়ালাইজার ডেটটাইম সমর্থন করে। দুর্ভাগ্যক্রমে DateTime.ToBinary
পদ্ধতিটি অত্যন্ত ধীর। আমি তাড়াতাড়ি কিছুটা দ্রুত এটির সাথে প্রতিস্থাপন করব।
সম্পাদনা 2: ইউটিসি ব্যবহারের সময় অনুরোধ DateTime
করে ToUniversalTime()
পারফরম্যান্সটি পুনরুদ্ধার হয় এবং 1.669ms এ ঘড়ি থাকে ।