سؤال

وقبل بضعة أشهر I تسلسل كائن java.io.Serializable إلى ملف. الان انا بحاجة لقراءة محتويات، ولكن منذ ذلك الحين غيرت serialVersionUID، وأنا الآن الحصول على "يتعارض الطبقة" خطأ. أنا أعرف حقيقة أن أيا من أعضاء البيانات قد تغيرت، وبالتالي فإن الحاجز الوحيد هو الاختيار serialVersionUID.

هل هناك طريقة إما تعطيل الاختيار أو تعديل serialVersionUID في ملف ثنائي؟

والتوضيح

وهذا السؤال هو افتراض أنني لا تستطيع تعديل المصدر. هل هناك طريقة يمكنني الإختراق الملف. الطبقة أو ربما الإختراق ملف الكائن تسلسل (استخدام محرر عرافة وتغيير قيمة في بعض بعض الإزاحة)؟

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

المحلول

ووالإختراق، يمكنك توليد serialVer JVM الخاصة بك على الأرجح تستخدم باستخدام أداة serialver:

وserialver -classpath مهما com.foo.bar.MyClass

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

نصائح أخرى

لماذا لا تعديل serialVersionUID في الإصدار الحالي بدلا من ذلك كما هو موضح في في وثائق التسلسل ؟

وأنا في الآونة الأخيرة وجدت نفسي في وضع مماثل - كان لي بعض الكائنات المتسلسلة التي كان علي أن أقرأ، وكان serialVersionUID من هذه الكائنات تختلف عن النسخة الأحدث و، في حالتي، كان هناك بضع serialVersionUIDs مختلفة المخزنة في ملف لنفس الفئة (المخزنة في أوقات مختلفة، ومن الواضح). لذلك لم يكن لديك متسع من تعديل الدرجة ووضع serialVersionUID بها؛ أنا فعلا للذهاب في وتعديل البيانات المخزنة.

ما أنا أحسب (من خلال قراءة شفرة المصدر java.io) هو أن الجسم يحصل على تسلسل عن طريق تخزين أولا اسم الفئة (باستخدام writeUTF()) وبعدها مباشرة باستخدام writeLong() لإنقاذ serialVersionUID.

وكان لي حل للقبض على استثناء ثم العودة، والبحث عن اسم الفئة، وعلى الفور بعد اسم الفئة استبدال serialVersionUID القديم والجديد.

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

لتكون مرجعا في المستقبل، لا تستخدم التسلسل أن تستمر البيانات بين دورات JVM.

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