2009-12-29 32 views
17

Nhiều người trong chúng ta đã được truyền bá bằng cách sử dụng XML để lưu trữ dữ liệu. Đó là lợi ích và hạn chế thường được biết đến, và tôi chắc chắn không muốn thảo luận ở đây. Tuy nhiên trong dự án tôi đang viết bằng C++, tôi cũng đang sử dụng Lua. Tôi đã rất ngạc nhiên như thế nào Lua có thể được sử dụng để lưu trữ và xử lý dữ liệu. Tuy nhiên, khía cạnh này của Lua ít được công nhận, ít nhất là trong thế giới lập trình game.Lua so với XML để lưu trữ dữ liệu

Tôi biết rằng XML có lợi thế trong trường hợp như gửi dữ liệu qua internet và ở những nơi an toàn phát (sử dụng dữ liệu được tải xuống từ mạng hoặc tải tệp cấu hình có thể chỉnh sửa người dùng) trong trường hợp cùng một dữ liệu đang được đọc bởi các chương trình bằng các ngôn ngữ khác nhau.

Tuy nhiên một khi tôi đã học được cách tốt và dễ dàng để xử lý dữ liệu bằng cách sử dụng Lua (đặc biệt là có luabind để sao lưu bạn!), Tôi bắt đầu tự hỏi là có bất kỳ lý do gì để sử dụng XML để lưu trữ dữ liệu trò chơi, nếu chúng ta đã sử dụng Lua sao?

Blizzard, trong khi sử dụng Lua để tạo kịch bản giao diện người dùng, vẫn lưu trữ bố cục trong XML. Có phải lý do gì đó chỉ liên quan đến giao diện người dùng không?

Những hạn chế của việc sử dụng Lua làm ngôn ngữ lưu trữ dữ liệu là gì?

+1

Vì khi nào XML được sử dụng để lưu trữ dữ liệu? XML là một mô tả dữ liệu hoặc ngôn ngữ đánh dấu, không phải là một cơ sở dữ liệu (hoặc bất kỳ thứ gì). – Rob

+1

Vâng, OK, xin vui lòng tha thứ cho tôi sự lựa chọn của tôi nghèo từ, tiếng Anh không phải là ngôn ngữ mẹ đẻ của tôi. Tuy nhiên, bạn phải đồng ý rằng bạn có thể sử dụng XML như một cách để mô tả dữ liệu, do đó lưu trữ nó trên đĩa, do đó như là một giải pháp lưu trữ dữ liệu? –

+4

Rob, có một read =) http://en.wikipedia.org/wiki/XML_database –

Trả lời

11

Đây có thể không phải là loại câu trả lời bạn mong đợi, nhưng nó có thể giúp bạn đưa ra quyết định.

Blizzard (WoW) sử dụng XML để xác định giao diện người dùng. It's kinda như XAML trong C#, chỉ cần ít hơn rất nhiều mạnh mẽ và hầu hết các addons chỉ sử dụng XML để bootstrap addon và sau đó xây dựng giao diện người dùng trong mã lua.

Ngoài ra WoW thực sự lưu trữ addon "Các biến đã lưu" trong các tệp .lua.

Theo ý kiến ​​của tôi, nó không quan trọng lắm. Chọn một cái gì đó bạn thích và đó là dễ sử dụng cho những người sẽ mở rộng động cơ của bạn.

Điều tốt về XML là có rất nhiều công cụ và mã đã được viết để kiểm tra, viết và phân tích cú pháp XML có nghĩa là nó có thể giúp bạn tiết kiệm thời gian. Ví dụ: XML Schema rất hữu ích để xác thực tệp tin người dùng (bảo mật chỉ là tác dụng phụ, điều tốt là nếu nó vượt qua lược đồ của bạn, dữ liệu rất có thể an toàn 100% và sẵn sàng được cắm vào công cụ của bạn) và có khá một vài trình xác nhận đã được viết cho bạn sử dụng.

Sau đó, một lần nữa một số người dùng sợ hãi từ các tệp XML (mặc dù chúng rất dễ đọc, có thể đọc được quá) và muốn một cái gì đó "đơn giản hơn". Nếu nó chỉ dành cho lưu trữ (không phải cấu hình) thì không ai sẽ chỉnh sửa các tệp đó trong hầu hết các trường hợp. XML cũng sẽ mất nhiều không gian hơn sau đó lua var dump (không quan trọng, trừ khi bạn có rất nhiều dữ liệu).

Tôi không nghĩ rằng bạn có thể đi sai ở đây. Blizzard đang sử dụng lua để lưu trữ và tôi khá thích cách nó hoạt động.

+0

Thực ra đây chính là loại câu trả lời mà tôi muốn nhận :). Cảm ơn bạn! Vâng, tôi đồng ý rằng việc xác thực và các công cụ XML khác là một lợi ích lớn, và tôi đã không nghĩ về điều đó trước đây. –

+5

Để làm rõ điều này một chút: Blizzard sử dụng XML cho các tệp được lấy từ các công cụ bên ngoài. Khi trò chơi bền bỉ dữ liệu của riêng họ, vì tiêu thụ của chính họ, tốt hơn là lưu trữ dữ liệu theo định dạng có nguồn gốc từ công cụ trò chơi. –

1

Tôi thường tránh xa XML, chủ yếu là do độ dài của nó. Hầu hết thời gian tôi sử dụng CSV hoặc SQLite để lưu trữ dữ liệu. Tôi sử dụng các ngôn ngữ kịch bản như Lua, Python hoặc Scheme để cung cấp một giao diện cho người dùng mở rộng phần mềm.

+1

CSV và SQLite có thể không tiết, nhưng không dễ dàng công cụ-con người có thể đọc được ... –

+0

Tôi không phải là một fan hâm mộ lớn của CSV, nhưng tôi đã tìm thấy bản thân mình bằng cách sử dụng SQLite nhiều hơn và thường xuyên hơn cho loại điều. Nó rất nhỏ, nhanh, được hỗ trợ và cực kỳ linh hoạt. Về bình luận của Kornel, mọi hộp Linux đều cung cấp nhị phân sqlite cho phép bạn giao tiếp với một cơ sở dữ liệu SQLite. Heck, tôi đã sử dụng nó trong các kịch bản lệnh shell để làm việc với các cơ sở dữ liệu SQLite. Nó không đơn giản là chết đơn giản như dữ liệu văn bản thẳng, nhưng nó không khó hơn nhiều, và nó có * rất nhiều lợi thế. –

3

Nếu tập lệnh lua là người dùng có thể truy cập, thì tập con của lua bạn đang sử dụng cho đặc tả dữ liệu phải được thực thi, nếu không bạn không chỉ là ngôn ngữ dữ liệu mà còn là lỗ hổng bảo mật. Vấn đề thực thi một tập con như vậy không phải là tầm thường.

Bạn có biết json không? Đó có thể là thứ bạn đang theo đuổi.

có hai triển khai ở đây: http://json.luaforge.net/

và đây http://www.chipmunkav.com/downloads/Json.lua

nếu json là không đủ mạnh, tùy chọn khác là YAML, một superset của JSON, mặc dù tôi không thể cho bạn biết nếu có là bất kỳ việc triển khai thực hiện nào ở Lua.

+0

Bảo mật không phải là vấn đề trong trường hợp của tôi, vì tôi sẽ cho phép sửa đổi động cơ. Tuy nhiên, trong khi JSON không phải là thứ tôi đang tìm kiếm, bạn chỉ cho tôi cái gì đó thực sự thu hút sự quan tâm của tôi cho các mục đích khác :) –

+2

Nó thực sự tầm thường để thực thi một tập hợp con như vậy. Bước một: Không tải bất kỳ thư viện nào vào môi trường. Bước hai: thực hiện. – jsimmons

5

Tôi cho rằng bất lợi lớn nhất là khó có thể sử dụng các công cụ khác để thao tác dữ liệu đó. Nếu bạn lưu trữ dữ liệu trực tiếp trong Lua, thì bạn cần phải viết trình phân tích cú pháp Lua để thao tác dữ liệu đó tự động, trong khi mọi môi trường đều có trình phân tích và trình tạo XML. Đây không phải là vấn đề chỉ dành cho các công cụ bằng các ngôn ngữ khác; nếu bạn muốn viết GUI để chỉnh sửa cấu hình, bạn có công cụ nào có thể phân tích cú pháp, sửa đổi và ghi dữ liệu cấu hình theo cách không ảnh hưởng đến việc hợp nhất trong hệ thống kiểm soát phiên bản của bạn không? Điều đó có thể quan trọng đối với các dự án lớn với nhiều người có thể đang chỉnh sửa cấu hình đồng thời.

Điều đó nói rằng, ý tưởng tương tự này là những gì đã dẫn đến JSON, là một tập con của JavaScript được sử dụng làm định dạng dữ liệu. Nhưng có rất nhiều công cụ hiện đang hỗ trợ JSON, và có lẽ không có nhiều công cụ hỗ trợ cú pháp của Lua.

Một vấn đề khác thỉnh thoảng xuất hiện khi bạn có mã của bạn là cấu hình của bạn là mọi người bắt đầu viết mã để tạo cấu hình, hoặc thêm abstractions vào tệp cấu hình của bạn. Và sau đó bất kỳ người dùng nào có thể muốn tùy chỉnh chương trình của bạn có thể bị lẫn lộn, phải học cách lập trình và toàn bộ ngôn ngữ lập trình thay vì ngôn ngữ cấu hình tương đối đơn giản.

+0

Tôi không lo lắng về những nhược điểm mà tôi đã đề cập trong bài viết của riêng tôi. Đó là câu hỏi liệu có những người khác mà tôi đã không nghĩ rằng đó là bugging tôi. –

+0

Rất tiếc, tôi đã bỏ lỡ phần mà bạn đã đề cập đến vấn đề đó. –

+0

Thêm chi tiết hơn một chút để vượt xa những gì bạn đã đề cập. Gần đây tôi đã làm việc với mã như cấu hình trong một công cụ đa phương tiện (Đề án, không phải Lua, nhưng cùng một ý tưởng cơ bản), và nó có những ưu điểm và nhược điểm của nó, vì vậy tôi đã đề cập đến một số vấn đề chạy vào. –

5

Nếu không bảo mật, hãy cân nhắc kỷ luật. Nếu phạm vi đầy đủ của LUA có sẵn trong một tệp dữ liệu, khả năng vẫn là thêm logic hoặc hành vi vào tệp dữ liệu của bạn. Có những thực thể có cả dữ liệu và hành vi này có thể làm phức tạp việc quản lý một dự án lớn: Giả sử ví dụ bạn đã xây dựng một công cụ trò chơi và toàn bộ trò chơi. Bây giờ bạn muốn loại bỏ tất cả nội dung cụ thể, hãy sử dụng lại công cụ trò chơi để tạo trò chơi mới. Nếu nội dung/dữ liệu được phân tách một cách an toàn khỏi hành vi, thì điều này khá đơn giản. Nếu trong một khoảnh khắc của sự yếu đuối, bạn quyết định một ngày rằng giải pháp tốt nhất cho vấn đề là lưu trữ một chức năng dưới dạng dữ liệu, sau đó mọi thứ trở nên hơi lạ.

Bạn có thể thực thi kỷ luật như vậy trong nhóm của mình, nhưng khả năng là có đối với người dùng, nó sẽ bị khai thác. Sau đó xuống con đường bạn quyết định thay đổi định dạng dữ liệu, và những phần mở rộng của người dùng không di động bởi vì chúng bao gồm lua không phải là dữ liệu!

Các thực thể như vậy khó thao tác theo chương trình trên quy mô lớn hơn.

Và có tất cả các vấn đề khác đến từ mối quan tâm riêng biệt không đúng cách. Nếu bạn cho phép dữ liệu và mã của bạn trộn, tất cả có thể vẫn hoạt động, nhưng những thứ rối tung hơn sẽ càng trở nên khó khăn hơn.

+0

Nhận xét có giá trị, cảm ơn bạn! Tuy nhiên, trình tải dữ liệu có thể thực thi kỷ luật, như lừa "xác định" cũ, tự động khóa khai báo tự do của các hàm/biến toàn cầu. Và, ví dụ, bạn vẫn có thể thực thi một máy ảo Lua riêng biệt tải các tệp dữ liệu (và VM bị loại bỏ khỏi bất kỳ API tập lệnh nào), trong khi tệp còn lại tải các tệp kịch bản lệnh. –

8

Lua là chiến thắng chính để lưu trữ dữ liệu. Thuận tiện, nhanh chóng và dễ dàng chuyển đổi sang các định dạng khác khi cần. (Chuyển đổi giả định rằng dữ liệu của bạn là biểu diễn trong các định dạng khác, mà nếu nó được biểu diễn trong XML, nó sẽ được.)

những hạn chế của việc sử dụng Lua như một ngôn ngữ lưu trữ dữ liệu là gì?

Tôi nhận thức được hai nhược điểm, tầm quan trọng của nó phụ thuộc vào ứng dụng của bạn:

  • Nếu bạn có bảng Lua có chứa tham chiếu vòng tròn, ví dụ, t1.next == t2t2.prev = t1 thì quá trình viết cấu trúc Lua của bạn vào đĩa trở nên tẻ nhạt, và kết quả là Lua khó đọc hơn một đơn giản return <list of big expressions here>. (Điều này chưa bao giờ xảy ra với tôi, và nếu dữ liệu của bạn được biểu diễn trong XML, nó sẽ không xảy ra với bạn.)

  • Nếu bạn có một nhiều dữ liệu — ví dụ nếu bạn đang viết một chỉ số đảo ngược của toàn bộ hướng dẫn sử dụng thông tin 7 — sau đó bạn có thể chạy afoul giới hạn của Lua về số lượng các hằng số riêng biệt có thể xuất hiện trong một khối. Sau đó, bạn phải chia mọi thứ thành nhiều khối hoặc chức năng hoặc giải quyết các giải pháp khác. Vấn đề này cắn tôi, và đó là một nỗi đau lớn trong ass. Tôi muốn viết một giải pháp chung, nhưng tôi không phải là 100% vững chắc, tôi hiểu các ràng buộc, và tôi chưa giải quyết nó.

    Nếu dữ liệu của bạn có ít hơn 100.000 chữ số và chuỗi ký tự, bạn không phải lo lắng về vấn đề này.

+0

Có dễ dàng chuyển đổi "miễn là ..." hay chỉ đơn giản là dễ dàng chuyển đổi trong mọi trường hợp, ngay cả khi có đầy đủ các thực thể rõ ràng trong lua, chẳng hạn như các bảng ảo? – Breton

+0

Cảm ơn, điểm đầu tiên là điểm mà tôi không thực sự nghĩ đến, nhưng tôi nghi ngờ rằng nó sẽ là một vấn đề, như trong trường hợp dữ liệu tôi sử dụng nó tương tự như XML. Điểm thứ hai cũng sẽ không phải là một vấn đề - tôi không có kế hoạch lưu trữ các mắt lưới như cấu trúc Lua (có, đó sẽ là một ý tưởng không khôn ngoan). –

+0

@Breton: dễ dàng chuyển đổi được cung cấp kết quả có thể được đại diện ở tất cả. Và kể từ XML, cuối cùng, văn bản, nội dung có thể là biểu tượng. Nhưng dù sao câu trả lời đã được chỉnh sửa. –

15

Cảm ơn bạn đã trả lời cho đến nay! Tôi sẽ tự do tổng hợp các điểm để tham khảo trong tương lai.

Nhược điểm của việc sử dụng Lua để lưu trữ dữ liệu, so với XML

  1. an cả khi chuyển dữ liệu và khi lưu trữ nó, đặc biệt là khi nhận dữ liệu từ một nguồn không rõ
  2. Khả năng di chuyển, và dễ dàng truy cập để dữ liệu bằng các công cụ khác
  3. Các công cụ hiện có hữu ích khác như trình xác nhận lược đồ XML
  4. Ít hỗ trợ phân tích cú pháp dữ liệu
  5. Vấn đề với tham chiếu vòng tròn
  6. Ít hạn chế - khó khăn hơn để thực thi công ước thích hợp, sử dụng và thiết kế

Lợi ích của việc sử dụng Lua để lưu trữ dữ liệu, so với XML

  1. Sử dụng một ngôn ngữ duy nhất cho cả tập lệnh và dữ liệu (không cần các tệp riêng biệt, không cần cho các trường hợp đặc biệt khi tải)
  2. Ít mã và phụ thuộc hơn do sử dụng một ngôn ngữ đơn
  3. Nhiều chi tiết hơn và có thể đọc được nhiều hơn
  4. Linh hoạt hơn và có thể mở rộng (sau cùng là ngôn ngữ lập trình)
  5. Dữ liệu được "thực thi" và có thể truy cập khi cần thiết trong máy ảo
  6. Đưa ít không gian, đặc biệt là nếu biên dịch để bytecode

Nếu tôi bị mất một cái gì đó trong danh sách đầu tiên, xin vui lòng chỉ nó ra!

2

Tôi đã thực hiện một vài dự án mà sử dụng Lua là ngôn ngữ lưu trữ dữ liệu/config

Yếu tố then chốt trong việc quyết định sử dụng nó là "Were chúng tôi đã sử dụng Lua vào dự án đó?"

Một điều nữa là di động của nó đến bất cứ đâu bạn có thể biên dịch trình thông dịch lua. Nó giống nhau trên tất cả các nền tảng - không có thư viện xml đặc biệt nào

JSON là một lựa chọn tốt.

Cách duy nhất để sử dụng XML trong những ngày này là với mã-gen được chú thích cho serializers .NET xml hoặc JAXB chẳng hạn).

3

Hãy nhớ rằng máy ảo Lua và ngôn ngữ rất linh hoạt. Bạn có thể sử dụng các môi trường chức năng để thực hiện bất kỳ hình thức an toàn nào bạn muốn, và sau đó sử dụng chính sách để tránh chạy mã "độc hại". Đơn giản chỉ cần loại bỏ mọi thứ từ môi trường bạn loadstring() dữ liệu của bạn và điều nguy hiểm duy nhất mà "dữ liệu" của bạn có thể làm là chạy vòng lặp và ghi CPU. Một điều khác cần nhớ là bạn luôn có thể chuyển đổi một bảng Lua thành XML và ngược lại, mặc dù ánh xạ các phần tử và các thuộc tính vào các bảng Lua sẽ dẫn đến một số mẫu lạ trong bảng.

+0

+1: cảm ơn bạn vì đã có thêm nhận xét có giá trị! –

Các vấn đề liên quan