Lua vs XML pour le stockage de données
Beaucoup d'entre nous ont été endoctrinés dans l'utilisation de XML pour le stockage des données. C'est avantages et les inconvénients sont généralement connus, et je certainement ne veux pas en discuter ici. Cependant, dans le projet que je suis en train d'écrire en C++, je suis également utiliser Lua. J'ai été très surpris de voir comment bien Lua peut être utilisé pour stocker et manipuler des données. Pourtant, cet aspect de la Lua est moins reconnu, au moins dans la programmation de jeux monde.
Je suis conscient que XML a ses avantages dans des cas comme l'envoi de données sur l'internet, et dans les endroits où la sécurité est en jeu (à l'aide de données téléchargées à partir du net par exemple, ou le chargement modifiable par l'utilisateur des fichiers de configuration) et, enfin, dans les cas où le même la lecture de données par les programmes dans différentes langues.
Cependant, une fois que j'ai appris comment agréable et il est facile de manipuler des données à l'aide de Lua (notamment en ayant luabind à dos vous!), J'ai commencé à me demander est-il une raison d'utiliser le format XML pour stocker des données de jeu, si on a déjà l'utilisation de Lua de toute façon?
Blizzard, lors de l'utilisation de Lua pour écrire le script de l'INTERFACE utilisateur, encore des magasins de la mise en page en XML. Est la raison de quelque chose qui est seulement l'INTERFACE, sont-ils liés?
Quels sont les inconvénients de l'utilisation de Lua comme un stockage de données de la langue?
- Depuis quand est-XML utilisé pour le stockage de données? XML est une description des données ou langage de balisage, pas une base de données (ou autre).
- Bon, OK, s'il vous plaît pardonnez-moi mon mauvais choix de mots pour l'anglais n'est pas ma langue maternelle. Pourtant, vous devez accepter que vous pouvez utiliser XML comme un moyen pour décrire les données, d'où le stocker sur le disque, donc comme une solution de stockage de données?
- Rob, à lire =) en.wikipedia.org/wiki/XML_database
- Je pense que Rob point est que le fait que XML est née d'un langage de balisage rend assez mal adaptés à une base de données de la couche de stockage, je peux certainement sympathiser avec. Le fait que les gens le faire ne pas dire que c'est une bonne idée.
- Brian, je suis d'accord, je ne suis pas un grand fan de XML pour stocker beaucoup de données, mais il n'répondre à sa question.
Vous devez vous connecter pour publier un commentaire.
Cela pourrait ne pas être le genre de réponse que vous attendiez, mais il peut vous aider à prendre votre décision.
Blizzard (WoW) utilise le langage XML pour définir l'INTERFACE utilisateur. C'est un peu comme XAML, C#, juste beaucoup moins puissante et la plupart des addons suffit d'utiliser XML pour l'amorçage de l'addon et puis de construire l'INTERFACE utilisateur dans le code lua.
Aussi WoW fait les magasins addon "des Variables Sauvegardées" dans .fichiers lua.
À mon avis, il n'a pas mater que beaucoup. Choisissez quelque chose que vous aimez et qui est facile à utiliser pour ceux qui vont prolonger votre moteur.
La bonne chose à propos de XML est qu'il y A BEAUCOUP d'outils et de code déjà écrit pour tester, d'écrire et d'analyser le XML, ce qui signifie qu'il peut vous faire économiser du temps. Par exemple Schéma XML's sont très utile pour la validation de l'utilisateur fichiers écrits (la sécurité est juste un effet secondaire, la bonne chose est que si elle passe votre schéma, les données sont les plus susceptibles de 100% sûre et prête à être branchée dans votre moteur) et il y a assez peu de validateurs déjà écrit pour vous à utiliser.
Puis, de nouveau, certains utilisateurs ont peur de fichiers XML (même si elles sont très lisibles, peut-être trop lisible) et préférez quelque chose de plus "simple". Si c'est juste pour le stockage (pas de configuration) puis personne ne va éditer les fichiers de toute façon dans la plupart des cas. XML sera également prendre plus d'espace, lua var dump (il ne devrait pas question, sauf si vous avez beaucoup de données).
Je ne pense pas que vous pouvez vous tromper ici. Blizzard est à l'aide de lua pour le stockage et la je l'aime bien comme la façon dont il fonctionne.
Merci pour vos réponses si loin! Je vais prendre la liberté de résumant les points de référence pour l'avenir.
Inconvénients de l'utilisation de Lua pour stocker des données, par rapport à XML
Avantages de l'utilisation de Lua pour stocker des données, par rapport à XML
Si j'ai raté quelque chose dans la première liste, merci de le signaler!
Lua est un succès majeur pour le stockage des données. Pratique, rapide, et facilement convertibles en d'autres formats en cas de besoin. (Convertibilité suppose que vos données sont représentable dans d'autres formats, qui, si elle est représentable en XML, il sera.)
Je suis conscient de deux inconvénients, dont l'importance dépend de votre application:
Si vous avez Lua tables qui contiennent des références circulaires, par exemple,
t1.next == t2
ett2.prev = t1
, alors le processus de la rédaction de votre Lua structures sur le disque devient ennuyeux, et de la Lua est plus difficile à lire qu'un simplereturn <list of big expressions here>
. (Ce n'est jamais arrivé à moi, et si vos données est représentable en XML, il vous arrive pas.)Si vous avez un beaucoup de données—par exemple, si vous écrivez un index inversé de l'ensemble de l'Informer de 7 manuelle—ensuite, vous pouvez aller à l'encontre de Lua de limites sur le nombre de constantes distinctes qui peuvent apparaître dans un bloc. Ensuite, vous devez diviser les choses en plusieurs blocs ou fonctions, ou de recourir à d'autres solutions. Ce problème a me piquer, et c'est une énorme douleur dans le cul. Je voudrais écrire une solution générale, mais je ne suis pas à 100% de solides, je comprends les contraintes, et je n'ai pas abordé encore.
Si vos données ont moins de 100 000 numérique et les littéraux de chaîne, vous n'avez pas à vous soucier de ce problème.
Si pas de sécurité, puis considérez la discipline. Si la gamme complète de LUA est disponible dans un fichier de données, il reste la possibilité d'ajouter de la logique ou le comportement de votre fichier de données. Ces entités qui sont à la fois les données et le comportement peuvent compliquer la gestion d'un grand projet: Supposons par exemple que vous avez construit un moteur de jeu, et un jeu entier. Maintenant, vous voulez en extraire tout le contenu spécifique, réutiliser le moteur de jeu pour faire un nouveau jeu. Si le contenu/données en toute sécurité est partitionné de comportement, alors c'est assez simple. Si dans un moment de faiblesse vous avez décidé un jour que la meilleure solution à un problème est de stocker une fonction comme les données, les choses deviennent un peu bizarre.
Vous pourriez être en mesure de faire respecter cette discipline au sein de votre équipe, mais de la possibilité pour un utilisateur, il sera exploité. Puis en bas de la route que vous décidez de modifier le format des données, et de ceux de l'utilisateur extensions ne sont pas portables parce qu'ils comprennent lua qui n'est pas données!
Ces entités sont plus difficiles à manipuler par programmation sur une échelle massive.
Et il y a tous les autres problèmes qui viennent de ne pas correctement séparant préoccupations. Si vous permettez à vos données et le code de mélanger, il sera tout probablement encore du travail, mais le plus embrouillé les choses plus difficiles qu'elles seront à la raison.
Je dirais que le plus grand inconvénient est qu'il est plus difficile pour d'autres outils pour manipuler ces données. Si vous stockez les données directement dans Lua, alors vous avez besoin d'écrire un Lua analyseur dans le but de manipuler automatiquement les données, tandis que chaque environnement a parseurs XML et des générateurs. Ce n'est pas un problème seulement pour les outils dans d'autres langues; si vous voulez écrire une interface graphique pour l'édition de votre configuration, vous avez des outils qui peut analyser, modifier et écrire les données de configuration d'une manière qui n'affecte pas la fusion dans votre système de contrôle de version? Qui peut être important pour les gros projets avec beaucoup de gens qui peut-être la modification de la configuration simultanément.
Cela dit, cette même idée est ce qui a conduit à JSON, qui est un sous-ensemble de JavaScript utilisé comme un format de données. Mais il y a beaucoup d'outils qui soutiennent JSON, et sans doute pas beaucoup qui prennent en charge Lua de la syntaxe.
Un autre problème qui arrive de temps en temps quand vous avez votre code soit votre configuration est que les gens de commencer à écrire du code pour générer la configuration, ou pour ajouter des abstractions pour votre fichier de configuration. Et puis tout les utilisateurs qui auraient envie de personnaliser votre programme pourrait le vent confus, avoir à apprendre comment faire un programme et un ensemble de langage de programmation plutôt que d'une configuration relativement simple de la langue.
Si les scripts lua sont accessibles à l'utilisateur, alors le sous-ensemble de lua que vous utilisez pour la spécification de données doit être exécutée, sinon ce que vous avez n'est pas seulement une langue, mais un trou de sécurité. Le problème de l'application d'une telle sous-ensemble n'est pas trivial.
Êtes-vous au courant de json? Qui pourrait être plus le genre de chose que vous êtes après.
il y a deux implémentations ici:
http://json.luaforge.net/
et ici
http://www.chipmunkav.com/downloads/Json.lua
si json n'est pas assez puissant, une autre option est de YAML, un sur-ensemble de JSON, bien que je ne pourrais pas vous dire s'il y a des décent implémentations de que en Lua.
Rappelez-vous que la VM Lua et la langue sont très flexibles. Vous pouvez Utiliser la fonction environnements à mettre en œuvre quelle que soit la forme de la sécurité, vous souhaitez, puis utiliser une stratégie pour éviter de courir "malveillant" du code. Il suffit d'éliminer TOUT, de l'environnement, vous loadstring() vos données avec et la seule chose dangereuse vos "données" peut faire est d'exécuter une boucle et de gravure du PROCESSEUR.
L'autre chose à retenir est que vous pouvez toujours convertir une table Lua en XML et vice-versa, si le mappage des éléments et des attributs sur Lua tables aura pour résultat un peu bizarre de modèles dans des tables.
J'ai fait quelques projets qui ont utilisé Lua comme le stockage de données/config langue
L'élément clé dans la décision d'utiliser, il a été "sommes-nous déjà à l'aide de Lua sur ce projet?"
Une autre chose est que son portable n'importe où, vous pouvez compiler l'interpréteur lua. C'est la même sur toutes les plateformes - il n'y a aucune xml bibliothèques
JSON est une bonne alternative.
La seule façon de mal l'utiliser XML est ces jours-ci avec annoté code-gen pour les sérialiseurs .NET, xml ou JAXB par exemple).
J'ai l'habitude de rester à l'écart de XML, principalement en raison de son niveau de verbosité. La plupart du temps j'utilise des CSVs ou SQLite pour le stockage de données. J'ai utiliser des langages de script comme Lua, Python ou Système à fournir une interface permettant à l'utilisateur d'étendre le logiciel.