J'ai pris la liberté de convertir vos classes dans le générateur CGbR. Comme il est dans une phase précoce, il ne prend pas encore en charge DateTime
, j'ai donc simplement remplacé par long. Le code de sérialisation généré ressemble à ceci :
public int Taille
{
get
{
var taille = 24;
// Ajouter la taille pour les collections et les chaînes de caractères
taille += Cts == null ? 0 : Cts.Count * 4;
taille += Tes == null ? 0 : Tes.Count * 4;
taille += Code == null ? 0 : Code.Length;
taille += Message == null ? 0 : Message.Length;
return taille;
}
}
public byte[] EnOctets(byte[] octets, ref int index)
{
if (index + Taille > octets.Length)
throw new ArgumentOutOfRangeException("index", "L'objet ne rentre pas dans le tableau");
// Convertir Cts
// Deux informations de longueur en octets pour chaque dimension
GeneratorByteConverter.Include((ushort)(Cts == null ? 0 : Cts.Count), octets, ref index);
if (Cts != null)
{
for(var i = 0; i < Cts.Count; i++)
{
var valeur = Cts[i];
valeur.EnOctets(octets, ref index);
}
}
// Convertir Tes
// Deux informations de longueur en octets pour chaque dimension
GeneratorByteConverter.Include((ushort)(Tes == null ? 0 : Tes.Count), octets, ref index);
if (Tes != null)
{
for(var i = 0; i < Tes.Count; i++)
{
var valeur = Tes[i];
valeur.EnOctets(octets, ref index);
}
}
// Convertir Code
GeneratorByteConverter.Include(Code, octets, ref index);
// Convertir Message
GeneratorByteConverter.Include(Message, octets, ref index);
// Convertir Date de début
GeneratorByteConverter.Include(StartDate.ToBinary(), octets, ref index);
// Convertir Date de fin
GeneratorByteConverter.Include(EndDate.ToBinary(), octets, ref index);
return octets;
}
public Td ÀPartirDesOctets(byte[] octets, ref int index)
{
// Lire Cts
var longueurCts = GeneratorByteConverter.ToUInt16(octets, ref index);
var tempCts = new List(longueurCts);
for (var i = 0; i < longueurCts; i++)
{
var valeur = new Ct().ÀPartirDesOctets(octets, ref index);
tempCts.Add(valeur);
}
Cts = tempCts;
// Lire Tes
var longueurTes = GeneratorByteConverter.ToUInt16(octets, ref index);
var tempTes = new List(longueurTes);
for (var i = 0; i < longueurTes; i++)
{
var valeur = new Te().ÀPartirDesOctets(octets, ref index);
tempTes.Add(valeur);
}
Tes = tempTes;
// Lire Code
Code = GeneratorByteConverter.GetString(octets, ref index);
// Lire Message
Message = GeneratorByteConverter.GetString(octets, ref index);
// Lire Date de début
StartDate = DateTime.FromBinary(GeneratorByteConverter.ToInt64(octets, ref index));
// Lire Date de fin
EndDate = DateTime.FromBinary(GeneratorByteConverter.ToInt64(octets, ref index));
return this;
}
J'ai créé une liste d'objets d'exemple comme suit :
var objets = new List();
for (int i = 0; i < 1000; i++)
{
var obj = new Td
{
Message = "Bonjour mon ami",
Code = "Un code qui peut être ajouté ici",
StartDate = DateTime.Now.AddDays(-7),
EndDate = DateTime.Now.AddDays(2),
Cts = new List(),
Tes = new List()
};
for (int j = 0; j < 10; j++)
{
obj.Cts.Add(new Ct { Foo = i * j });
obj.Tes.Add(new Te { Bar = i + j });
}
objets.Add(obj);
}
Résultats sur mon ordinateur en mode Release
:
var montre = new Stopwatch();
montre.Start();
var octets = BinarySerializer.SerializeMany(objets);
montre.Stop();
Taille : 149000 octets
Temps : 2.059ms 3.13ms
Édition : À partir de CGbR 0.4.3, le sérialiseur binaire prend en charge DateTime. Malheureusement, la méthode DateTime.ToBinary
est incroyablement lente. Je vais la remplacer bientôt par quelque chose de plus rapide.
Édition2 : Lorsque l'on utilise UTC DateTime
en invoquant ToUniversalTime()
, les performances sont restaurées et s'établissent à 1.669ms.
2 votes
Performance ou empreinte de code?
0 votes
Est-ce que tu me demandes si j'ai besoin de données de performance ou de code?
3 votes
Il demande si, par "le moyen le plus rapide", vous entendez en termes de performance ou en termes d'empreinte de code.
BinaryFormatter
est extrêmement rapide en termes de code et d'implémentation, mais une solution comme celle de Marc sera plus performante dans un test de référence.0 votes
D'accord, je comprends, je voulais dire en termes de performance...
0 votes
Il y a de nombreux liens là-bas. Un tel lien : blogs.msdn.com/b/youssefm/archive/2009/07/10/…
0 votes
Vitesse est un aspect, la taille produite en est un autre, la sécurité en est un troisième. Les sérialiseurs sécurisés sont généralement non polymorphes et peuvent nécessiter des contrats annotés. Mais la vitesse de la sérialisation en elle-même est négligeable de toute façon, si la charge utile est extraite d'un flux réseau, d'un fichier ou d'une base de données. Je ne vais pas copier-coller une réponse précédente ici alors consultez le lien pour plus de réflexions sur les sérialiseurs binaires (et polymorphes).