جافا:حفظ الكائنات في ملف نصي؟هل هناك حلول جاهزة؟

StackOverflow https://stackoverflow.com/questions/170554

  •  05-07-2019
  •  | 
  •  

سؤال

أريد حفظ الكائنات التي قمت بإنشائها في البرنامج.بعد إعادة التشغيل، يجب أن يقوم التطبيق بتحميل جميع الكائنات الموجودة في المصفوفة تلقائيًا.أريد كتابتها في ملف وتحليلها بعد إعادة التشغيل.هل هناك احتمالات أخرى أكثر ذكاءً من القيام بذلك يدويًا؟شكرًا لك

هل كانت مفيدة؟

المحلول

يمكنك استخدام ال بيركلي دي بي PersistentMap فئة لحفظ الخاص بك (Serializable) الكائنات في أ Map التنفيذ (ذاكرة التخزين المؤقت) الذي يحفظها في ملف.إنه سهل الاستخدام للغاية ويعني أنه لا داعي للقلق بشأن ما يجب حفظه ومكانه.

ثلاثة أشياء يجب ملاحظتها حول التسلسل:

  1. كيف ستتعامل مع تغييرات المخطط (أي؟تغيير البيانات التي تتكون منها فصولك - إضافة حقل جديد على سبيل المثال)
  2. ماذا يحدث إذا أصبح ملفك (ملفاتك) تالفًا؟سيؤثر الاعتماد على مدى موثوقية تخزين برنامجك على قرارك بشأن كيفية حفظ البيانات التي تحتوي عليها كائناتك ضمنيًا.تذكر أنه يمكنك دائمًا استخدام قاعدة بيانات علائقية مثل ماي إس كيو إل ثم قم بتحويل هذه البيانات إلى كائناتك
  3. هل تحتاج إلى أن تكون قادرًا على عرض البيانات أو الاستعلام عنها الخارج من برنامجك؟ماذا لو كنت تريد الإجابة على بعض الأسئلة البسيطة مثل "كم عدد الكائنات التي لديها خاصية X؟" من السهل القيام به إذا كنت قد استخدمت قاعدة بيانات (علائقية) ؛ليس بهذه السهولة إذا قمت بتسلسل الأشياء إلى ملفات!

نصائح أخرى

نعم، هذا المفهوم كنت تبحث عن ما يسمى التسلسل. هناك تعليمي جيد في صن هنا .

والفكرة هي أن الطبقات التي تريد أن تستمر لها لتنفيذ واجهة للتسلسل. بعد ذلك يمكنك استخدام java.io.ObjectOutputStream.writeObject () لإرسال الكائن إلى ملف وjava.io.ObjectInputStream.readObject () لقراءة مرة أخرى.

لا يمكن إجراء تسلسل كل شيء، كما أن هناك أشياء لا معنى لتسلسل، ولكن يمكنك العمل من حولهم. وهنا أقتبس عن ذلك:

<اقتباس فقرة>   

والآلية الأساسية للجافا   التسلسل سهلة الاستعمال، ولكن   هناك بعض أكثر الأشياء أن تعرف. مثل   ذكرت من قبل، فقط الكائنات ملحوظ   تسلسل يمكن ان يستمر. ال   الطبقة java.lang.Object لا   تنفيذ تلك الواجهة. وبالتالي،   ليس كل الكائنات في جافا يمكن أن يكون   استمرت تلقائيا. الاخبار الجيدة   غير أن معظمها - مثل الهجوم الجوي و   سوينغ واجهة المستخدم الرسومية المكونات، سلاسل، و   المصفوفات - هي تسلسل

.      

وعلى صعيد آخر، بعض   دروس على مستوى النظام مثل الموضوع،   OutputStream والفئات الفرعية، و   مقبس ليست للتسلسل. في الواقع،   انها لن تقدم أي معنى إذا كانت   كانت. على سبيل المثال، موضوع تشغيل في   سيكون لي JVM يكون باستخدام نظام بلدي   ذاكرة. استمرار ذلك، ومحاولة   تشغيله في JVM الخاصة بك من شأنها أن تجعل أي معنى   على الاطلاق. نقطة أخرى مهمة حول   java.lang.Object عدم تنفيذ   واجهة للتسلسل هو أن أي   الطبقة إنشاء يمتد فقط   الكائن (وليس تسلسل الآخرين   الطبقات) ليست إلا للتسلسل   تقوم بتنفيذ واجهة نفسك   (كما فعلت مع المثال السابق).

     

ويعرض هذا الوضع مشكلة:   ما إذا كان لدينا فئة التي تحتوي   مثيل الموضوع؟ في هذه الحالة،   يمكننا من أي وقت مضى لا تزال قائمة الكائنات التي   اكتب؟ كان الجواب نعم، ما دمنا   نقول للآلية التسلسل لدينا   النوايا عن طريق وضع علامة الفئة التي لدينا   الكائن الموضوع كما عابرة.

وأنت قد ترغب في التحقق من جاوة الفعالة لبعض gotchas فيما يتعلق التسلسل. وتقدم هذه عادة ولكن إذا كانت هذه الميزة هي جزء أساسي من التطبيق الخاص بك، فأنت تريد أن تعرف عنها مسبقا.

وتشمل

وأمثلة المخاوف الأمنية، والميراث، والأهم من ذلك القدرة على الملأ "تجميد" على API مع تحقيق ذلك (على سبيل المثال عبر إصدارات البرامج). مرة أخرى، هذه كلها متقدمة ويجب أن لا يردع لكم في حد ذاته.

وjava.io.Object [الإدخال / الإخراج] ستريم هي الطبقتين تحتاج إلى النظر فيها.
أي درجة التي ترغب أن تستمر لتقديم الاحتياجات لتنفيذ واجهة java.io.Serializable.

وقد ترغب أيضا في النظر في استخدام الترميز XML، والذي يبدو لي أن يكون أكثر متانة من التسلسل. استخدام فئات java.beans.XMLEncoder/XMLDecoder.

وأنا لم تستخدم ذلك، ولكن مدونة جوجل صدر protobuf مؤخرا.

وأنا أتفق مع mjlee أن بروتوكول المخازن من جوجل هو أفضل طريقة للقيام تخزين كائنات من طريقة التسلسل الأصلي. نلقي نظرة، وسوف الحب.

وأتساءل لماذا لم يذكر أحد JSON و، على سبيل المثال، <أ href = على "HTTP : //wiki.fasterxml.com/JacksonInFiveMinutes "يختلط =" نوفولو "> جاكسون JSON مسلسل

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top