جافا - التعديل serialVersionUID من وجوه تسلسل ثنائي
-
22-07-2019 - |
سؤال
وقبل بضعة أشهر I تسلسل كائن java.io.Serializable إلى ملف. الان انا بحاجة لقراءة محتويات، ولكن منذ ذلك الحين غيرت serialVersionUID، وأنا الآن الحصول على "يتعارض الطبقة" خطأ. أنا أعرف حقيقة أن أيا من أعضاء البيانات قد تغيرت، وبالتالي فإن الحاجز الوحيد هو الاختيار serialVersionUID.
هل هناك طريقة إما تعطيل الاختيار أو تعديل serialVersionUID في ملف ثنائي؟
والتوضيح
وهذا السؤال هو افتراض أنني لا تستطيع تعديل المصدر. هل هناك طريقة يمكنني الإختراق الملف. الطبقة أو ربما الإختراق ملف الكائن تسلسل (استخدام محرر عرافة وتغيير قيمة في بعض بعض الإزاحة)؟
المحلول
ووالإختراق، يمكنك توليد serialVer JVM الخاصة بك على الأرجح تستخدم باستخدام أداة serialver:
وserialver -classpath مهما com.foo.bar.MyClass
إذا ثم يدويا تعيين serialVerUID في صفك أنه يجب أن تتناسب ويجب عليك أن تكون قادرة على تحميل، على افتراض انك لم تتغير الطبقة في مثل هذه الطريقة لإبطال.
نصائح أخرى
لماذا لا تعديل serialVersionUID في الإصدار الحالي بدلا من ذلك كما هو موضح في في وثائق التسلسل ؟
وأنا في الآونة الأخيرة وجدت نفسي في وضع مماثل - كان لي بعض الكائنات المتسلسلة التي كان علي أن أقرأ، وكان serialVersionUID
من هذه الكائنات تختلف عن النسخة الأحدث و، في حالتي، كان هناك بضع serialVersionUID
s مختلفة المخزنة في ملف لنفس الفئة (المخزنة في أوقات مختلفة، ومن الواضح). لذلك لم يكن لديك متسع من تعديل الدرجة ووضع serialVersionUID
بها؛ أنا فعلا للذهاب في وتعديل البيانات المخزنة.
ما أنا أحسب (من خلال قراءة شفرة المصدر java.io) هو أن الجسم يحصل على تسلسل عن طريق تخزين أولا اسم الفئة (باستخدام writeUTF()
) وبعدها مباشرة باستخدام writeLong()
لإنقاذ serialVersionUID
.
وكان لي حل للقبض على استثناء ثم العودة، والبحث عن اسم الفئة، وعلى الفور بعد اسم الفئة استبدال serialVersionUID
القديم والجديد.
وتم توثيقه أن التسلسل لا يعتزم استخدامها لاستمرار البيانات. من أجل الحصول على تلك البيانات مرة أخرى، وسوف تحتاج لخفض الإصدار الخاص بك من JVM إلى الإصدار الذي تم استخدامه لإخراج تلك البيانات.
لتكون مرجعا في المستقبل، لا تستخدم التسلسل أن تستمر البيانات بين دورات JVM.