La sérialisation Java alternative avec de meilleures performances
Suppose que je utiliser le Java standard de sérialisation d'un objet pour écrire/lire les petits (< 1K) des objets Java à/à partir de la mémoire tampon. La partie la plus critique est la désérialisation, c'est à dire la lecture des objets Java à partir de la mémoire tampon (tableau d'octets).
Est-il une alternative plus rapide à la sérialisation standard de Java pour ce cas ?
Pourquoi ne pas essayer quelque chose comme le protocole de tampon? Il est plus rapide que Java natif de sérialisation dans la plupart des cas, pour ce que je voulais l'utiliser. J'ai commencé à l'utiliser pour vraiment simple d'utilisation, mais son lentement devenu une partie importante dans un projet que je suis impliqué dans, principalement pour la création de contrats.
Je suis tombé sur cette question, parce que est me suis posé la même question. Si il y a des mesures pour comparer (je suis sûr que quelqu'un l'a fait telle chose) - ensuite, cette question peut être répondue avec des faits, pas des opinions. Ce n'est pas la questions un problème, mais le answeres problème. corrigez-moi si je suis mal - sinon, je vais modifier la question, de sorte qu'il convienne à l'critères pour la rouvrir.
Je suis tombé sur cette question, parce que est me suis posé la même question. Si il y a des mesures pour comparer (je suis sûr que quelqu'un l'a fait telle chose) - ensuite, cette question peut être répondue avec des faits, pas des opinions. Ce n'est pas la questions un problème, mais le answeres problème. corrigez-moi si je suis mal - sinon, je vais modifier la question, de sorte qu'il convienne à l'critères pour la rouvrir.
OriginalL'auteur Michael | 2012-12-23
Vous devez vous connecter pour publier un commentaire.
ont un coup d'oeil à kryo.
il est beaucoup beaucoup plus rapide que dans le haut-mécanisme de sérialisation (qui écrit beaucoup de chaînes, et s'appuie fortement sur la réflexion), mais un peu plus difficile à utiliser.
edit: R. Moeller ci-dessous suggéré FST, que je n'ai jamais entendu parler jusqu'à maintenant, mais qui semble être à la fois plus rapide que kryo et compatible avec java intégré dans la sérialisation (ce qui devrait le rendre encore plus facile à utiliser), donc je regarderais que le 1er
la java intégré dans le mécanisme de sérialisation écrit le nom de classe entièrement qualifié au début de chaque sérialisé exemple - dans le cas contraire il ne connaît pas le regarder lors de la désérialisation. kryo peut (éventuellement) register() classes connues (si vous savez à l'avance les types que vous serez en lecture/écriture) et peut utiliser une petite int-tête au lieu d'un FQCN - si petite taille. vous pouvez également vous inscrire Sérialiseurs pour les classes, évitant ainsi la réflexion des recherches (l'interface serializable, la sérialisation annotations, etc) - plus rapide io. kryo ne marche pas gérer les versions d'objets (par défaut, vs serialVersionUID) - plus rapide encore.
aussi, lors de la désérialisation du mécanisme intégré a besoin d'une Classe.forName() avec le FQCN - plus lent que d'une carte de les gestionnaires inscrits.
OriginalL'auteur radai
Vous pourriez également jeter un coup d'oeil à FST.
fournit également des outils pour offheap de lecture/écriture
Wow, pour mon cas d'utilisation, je viens de couper la désérialisation de temps sur mon gros objets de plus de 30s à 4s (aussi, en bonus, la forme sérialisée est plus petit), en utilisant simplement leur Plaine ObjectOutputStream de Remplacement. Cette lib est absolument un must essayer si vous comptez sur le JDK de sérialisation dans votre projet!
OriginalL'auteur R.Moeller
Essayer Google protobuf ou Aubaines.
OriginalL'auteur SpyBot
La sérialisation standard qui ajoute beaucoup de type d'information qui est ensuite vérifiée lorsque l'objet est désérialisé. Lorsque vous connaissez le type de l'objet que vous désérialisation, ce n'est généralement pas nécessaire.
Ce que vous pourriez faire, c'est de créer votre propre méthode de sérialisation pour chaque classe, qui écrit toutes les valeurs de l'objet à un octet de la mémoire tampon, et un constructeur (ou méthode de fabrique, lorsque vous vous balancez de cette façon) qui prend un tampon d'octets et lit toutes les variables.
Mais comme AlexR je me demande si vous avez vraiment besoin de cela. La sérialisation est généralement nécessaire lorsque les données quitte le programme (comme stocké sur le disque ou envoyées sur le réseau à un autre programme).
Je n'étais pas suggérer de remplacer la norme méthode serialize - je suggère de créer un tout nouveau mécanisme de sérialisation qui n'utilise pas la norme.
oh, désolé, alors. dans ce cas, je dois dire que la roue a déjà été inventé (kryo, entre autres)
OriginalL'auteur Philipp
Java standard de sérialisation est connu pour être lent, et l'utilisation d'une énorme quantité d'octets sur le disque. Il est très simple de faire votre propre de la sérialisation.
javas std sérialisation est agréable pour le projet de démonstration, mais pour les raisons ci-dessus n'est pas bien adapté pour les projets professionnels. Outre la gestion des versions est pas bien sous votre contrôle.
java fournit tous vous avez besoin pour personnaliser la sérialisation, voir le code de démonstration dans mon post au
Java partielle de la (dé)sérialisation d'objets
Avec cette approche, vous pouvez spécifier le format de fichier binaire, tels que, en C ou en C#, il pouvait être lu, trop.
Un autre avantage personnalisé setialized objets ont besoin de moins d'espace dans la mémoire principale (un booléen besoin de 4 octets dans les principales memm mais seulement 1 octet lorsque personnalisée sérialisée (byte)
Si differnet les partenaires du projet ont à lire votre serialied de données, Googles Protobuf est une alternative à regarder.
OriginalL'auteur AlexWien