2009-02-10 13 views
1

J'ai un ArrayList d'objets en cours de vidage vers une chaîne YAML et j'ai comparé les performances de JYaml et SnakeYaml dans la gestion de cela.JYaml: objet de vidage sans inclure le nom de classe

ArrayList<HashMap> testList = new ArrayList<HashMap>(); 
    HashMap<String, String> testMap1 = new HashMap<String, String>(); 
    HashMap<String, String> testMap2 = new HashMap<String, String>(); 

    testMap1.put("1_1", "One"); 
    testMap1.put("1_2", "Two"); 
    testMap1.put("1_3", "Three"); 

    testMap2.put("2_1", "One"); 
    testMap2.put("2_2", "Two"); 
    testMap2.put("2_3", "Three"); 

    testList.add(testMap1); 
    testList.add(testMap2); 

    System.out.println(jYaml.dump(testList)); 
    System.out.println(snakeYaml.dump(testList)); 


La sortie de JYaml comprend le nom de la classe d'objet sérialisé alors que la sortie de SnakeYaml ne:

sortie JYaml:

- !java.util.HashMap 
    1_1: One 
    1_3: Three 
    1_2: Two 
- !java.util.HashMap 
    2_1: One 
    2_2: Two 
    2_3: Three 

sortie SnakeYaml:

- {'1_1': One, '1_3': Three, '1_2': Two} 
- {'2_1': One, '2_2': Two, '2_3': Three} 


Je préfère la sortie sans nom de SnakeYaml, plus «propre», car cela serait plus approprié pour un environnement neutre. Je préfère la vitesse de JYaml. Les temps de sérialisation/désérialisation augmentent linéairement avec la quantité de données en cours de traitement, par opposition à exponentiellement avec SnakeYaml. Je voudrais contraindre JYaml à me donner un résultat sans nom de classe, mais je suis assez perdu quant à la façon dont cela peut être réalisé.

+0

(http://trac-hg.assembla.com/snakeyaml/report/1) Une fois que le problème de performance est signalé et identifié, il peut être corrigé. La sortie de SnakeYAML est très flexible. Vérifiez http://instantyaml.appspot.com/ (connectez-vous pour voir les options) – Andrey

+0

Le problème est identifié: les expressions régulières ne sont pas mises à l'échelle dans SnakeYAML. JYaml n'utilise pas d'expressions régulières pour trouver le bon type. (scalar est toujours une chaîne dans JYaml). Il est possible de suivre la même approche dans SnakeYAML. Est-ce ce que vous attendez? – Andrey

+0

@andrey: Merci d'avoir signalé cela. Je suis maintenant plus curieux: est-ce que l'utilisation d'expressions régulières, comme vous l'expliquez, est requise de telle sorte que/tout/dumper/chargeur bien écrit présente les mêmes problèmes de performance? –

Répondre

-1

Vérifiez la dernière source de SnakeYAML. It is now possible (identique à JYaml) pour ignorer la typage implicite et toujours analyser les scalaires comme des chaînes. C'est quelques fois plus rapide. Regardez here et here pour voir comment utiliser la nouvelle fonctionnalité. (Avec les expressions RegularExpressions off, les temps de sérialisation/désérialisation augmentent linéairement avec la quantité de données en cours de traitement.Pourquoi ne pas créer un ticket dans SnakeYAML?

+0

-1 cela n'inclut pas la réponse pour savoir comment obtenir jyaml pour ne pas inclure les noms de classe. C'est pour ça que je suis venu ici. –

+0

tous les liens sont morts. –

-1

Comment mesurez-vous la vitesse? Que voulez-vous dire par «quantité de données»? Est-ce la taille d'un document YAML ou d'une quantité de documents?

La sortie JYaml est incorrect. Selon la spécification, les caractères de soulignement en chiffres sont ignorés et 1_1 = 11 (au moins pour YAML 1.1). Parce qu'il est en fait une chaîne et non un nombre entier de la représentation est:

  • '1_1': Un

ou canoniquement

  • !! str "1_1": !! str "One"

Sinon, lorsque le document est analysé, il crée carte < Entier, String> au lieu de Carte < Chaîne, String>

JYaml a beaucoup de questions en suspens et ne met pas en œuvre complète YAML 1.1

JYaml peut en effet être plus rapide, mais elle est due à l'analyse simplifiée et à émettre.

+0

-1 cela ne répond pas à la question. –