سؤال

أنا أعمل حاليا على مشروع الذي يحتاج أن تستمر أي نوع من وجوه (منها تنفيذ ليس لدينا أي سيطرة) لذلك هذه الكائنات يمكن استردادها بعد ذلك.

يمكننا تنفيذ ORM لأننا لا يمكن أن تقيد مستخدمي المكتبة في تنمية الوقت.

لدينا البديل الأول هو تسلسل مع جافا الافتراضية التسلسل ولكن كان لدينا الكثير من المتاعب استعادة الكائنات عندما بدأ المستخدمين لتمرير إصدارات مختلفة من نفس الكائن (تغيير سمات أنواع الأسماء،...).

حاولنا مع XMLEncoder فئة (تحول كائن إلى XML) ، ولكن وجدنا أن هناك نقص في وظائف (لا يدعم Enums على سبيل المثال).

أخيرا, حاولنا أيضا JAXB ولكن هذا فرض المستخدمين إلى تعليم صفوفهم.

أي خير بديل ؟

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

المحلول

أسهل شيء بالنسبة لك أن تفعل ما زال استخدام التسلسل ، المنظمة البحرية الدولية ، ولكن وضع المزيد من التفكير في تسلسل شكل فصول (الذي يجب القيام به على أي حال).على سبيل المثال:

  1. صراحة تحديد SerialUID.
  2. تحديد الخاصة بك تسلسل شكل عند الاقتضاء.

تسلسل النموذج هو جزء من فئة' API و دقيق الفكر يجب أن تكون وضعت في تصميمها.

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

http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683


وقال مع ذلك, إذا كنت لا تزال تفكر في عدم التسلسل النهج, هنا بضعة:

XML التنظيم

العديد من أشار هو الخيار ، ولكن أعتقد أنك سوف لا تزال تعمل في نفس مشاكل التوافق مع الإصدارات السابقة.ومع ذلك, مع XML التنظيم, سوف نأمل القبض على هؤلاء حالا لأن بعض الأطر قد تفعل بعض الشيكات لك أثناء التهيئة.

التحويل إلى/من YAML

هذا هو فكرة لقد تم اللعب مع, ولكن أنا حقا أحب YAML شكل (على الأقل مخصص toString() شكل).ولكن الفرق الوحيد هو أنك ستكون التنظيم إلى YAML بدلا من XML.الفائدة الوحيدة هي أن YAML هو أكثر قليلا الإنسان للقراءة من XML.نفس تطبيق القيود.

نصائح أخرى

إنه 2011 في الصف تجارية بقية خدمات ويب المشروع نستخدم التالية serializers أن نقدم لعملائنا مجموعة متنوعة من أنواع وسائل الإعلام:

  • XStream (XML ولكن ليس JSON)
  • جاكسون (عن سلمان)
  • Kryo (سريع ثنائي مدمج شكل التسلسل)
  • ابتسامة (ثنائي الشكل الذي يأتي مع جاكسون 1.6 أو في وقت لاحق).
  • جافا Object Serialization.

نحن جربت أخرى serializers مؤخرا:

  • SimpleXML يبدو الصلبة ، يعمل في 2x سرعة XStream ، ولكن يتطلب الكثير من التكوين عن الوضع لدينا.
  • YamlBeans كان زوجين من الخلل.
  • SnakeYAML كان الخلل طفيفة تتعلق التواريخ.

جاكسون JSON ، Kryo و جاكسون ابتسامة تم كل شيء بشكل أسرع من القديمة الجيدة كائن جافا التسلسل بحوالي 3 إلى 4.5 x.XStream على الجانب بطيئة.ولكن هذه كلها الصلبة الخيارات في هذه المرحلة.سنستمر في رصد الثلاثة الأخرى.

http://x-stream.github.io/ هو لطيف، يرجى اتخاذ انظر إليه! مريحة للغاية

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

منها تنفيذ ليس لدينا أي سيطرة

والحل هو لا تفعل هذا . إذا لم يكن لديك السيطرة على تنفيذ نوع من لا يجب أن serialising ذلك. نهاية القصة. يوفر جافا التسلسل serialVersionUID خصيصا لادارة عدم التوافق التسلسل بين الإصدارات المختلفة من نوع. إذا لم يكن لمراقبة تنفيذ لا يمكنك أن تكون على يقين من أن معرفات يجري تغيير بشكل صحيح عندما يتغير مطور فئة.

وخذ مثال بسيط من 'نقطة'. ويمكن أن يمثله إما الديكارتية أو نظام الإحداثيات القطبية. سوف يكلفها باهظة بالنسبة لك لبناء نظام يمكنه التعامل بشكل حيوي مع هذه الأنواع من التصحيحات - لديها حقا أن تكون المطور من الطبقة الذي يصمم التسلسل

.

وباختصار فإنه من التصميم الخاص بك الذي هو الخطأ - وليس التكنولوجيا

وجاءت

وجوجل مع بروتوكول ثنائي - http://code.google.com/apis/ protocolbuffers / أسرع، لديها حمولة أقل بالمقارنة مع XML - التي الآخرين قد اقترح كبديل

واحدة من advanteages من مخازن البروتوكول هو أنه يمكن تبادل المعلومات مع C، C ++، بيثون وجافا.

وحاول تسلسل لسلمان مع Gson على سبيل المثال.

وأيضا سريع جدا التسلسل استبدال انخفاض في JDK: http://ruedigermoeller.github.io/fast-serialization/

إذا التسلسل السرعة هو مهم بالنسبة لك ثم هناك مؤشر شامل من JVM serializers هنا:

وشخصيا، وأنا استخدم شهرة الكثير، لأنه يتميز العمل المشترك مع من Smalltalk (سواء VW و صرير) وبيثون. (تنويه، أنا المساهم الرئيسي للمشروع شهرة).

Betwixt هي مكتبة جيدة لتسلسل الأشياء - لكنه لن يكون نوع التلقائي من شيء. وإذا كان عدد من الأشياء لديك لتسلسل هو ثابت نسبيا، وهذا قد يكون خيارا جيدا بالنسبة لك، ولكن إذا كان لديك "العميل سوف يتم رمي فئات جديدة عليك في كل وقت، قد يكون المزيد من الجهد أكثر مما يستحق ( بالتأكيد أسهل من XMLEncoder لجميع الحالات الخاصة، على الرغم من).

وثمة نهج آخر هو تتطلب العملاء لتوفير الملفات .betwixt مناسبة لأي الأشياء التي يلقي عليك (أن يفرغ فعال مسؤولية لهم).

وطويل وقصير - التسلسل هو <م> من الصعب - هناك نهج الأموات لا الدماغ تماما لذلك. التسلسل جافا هو أقرب إلى حل دماغيا كما رأيت من أي وقت مضى، ولكن كما كنت قد وجدت، واستخدام غير صحيح من قيمة رمز المستخدم الصيغة يمكن كسرها. يتطلب جافا التسلسل أيضا استخدام واجهة علامة "تسلسل"، حتى إذا كنت لا تستطيع السيطرة على المصدر، وأنت نوع من الخروج من الحظ في أن واحد.

وإذا كان الشرط هو حقا شاقة كما تصفون، قد تضطر إلى اللجوء إلى نوع من قبل الميلاد (بايت تعديل الشفرة) على الكائنات / / الجوانب أيا كان. هذا هو الحصول على الطريق خارج نطاق مشروع تنموي صغير، وإلى عالم من السبات، كاسبر أو ORM ....

وهناك فكرة أخرى: استخدام ذاكرة التخزين المؤقت. توفر مخابئ أفضل بكثير السيطرة، والتدرجية ومتانة إلى التطبيق. لا تزال بحاجة إلى تسلسل، على الرغم من، ولكن إدارة يصبح أسهل بكثير مع ضمن إطار خدمة التخزين المؤقت. ذاكرة التخزين المؤقت يمكن استمر في الذاكرة، القرص، وقاعدة البيانات أو مجموعة - أو كل الخيارات - على أن يكون أحدهما تجاوز، والوقوف من قبل، تجاوز الفشل للطرف الآخر. العموم هيئة الأركان المشتركة وEhcache هما تطبيقات جافا، وهذا الأخير هو الحل المشاريع الحرة تصل إلى 32 جيجابايت للتخزين (تنويه: أنا لا أعمل لehcache ؛-)).

وSBE هي مكتبة أنشئت لالسريعة، مكتبة التسلسل bytebuffer مقرها وقادرة على الإصدارات. ومع ذلك فإنه من الصعب بعض الشيء لاستخدام كل ما تحتاج لكتابة فصول طول المجمع أكثر من ذلك.

في ضوء أوجه القصور فيها، لقد جعلت مؤخرا فقط مكتبة جافا التسلسل مستوحاة من SBE وFIX بروتوكول (بروتوكول سوق مالية مشتركة لتبادل الرسائل التجارية / الاقتباس)، الذي يحاول الحفاظ على مزايا كل حين التغلب على نقاط الضعف. يمكنك إلقاء نظرة على https://github.com/iceberglet/anymsg

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