سؤال

لدينا نظام إنتاج يستخدم الكثير من التسلسل. ما يفعله بشكل أساسي هو تخزين كائن يسمى ProcessData في قاعدة بيانات JBPM كبايت. وبالتالي هذا التسلسل.

النظر في الكائن التالي.

public class ProcessData implements Serializable {
  private static final long serialVersionUID = -4859440951531011062L;

  public void getX() {
    //not important
  }
}

الآن دعنا نقول أن لدينا هذا الكائن مخزّن في قاعدة بيانات JBPM كبايت ونستخدم هذا في الإنتاج.

الآن في وقت لاحق نريد ترقية كائن ProcessData ببيانات جديدة

public class ProcessData implements Serializable {
  private static final long serialVersionUID = -4859440951531011062L;

  public void getX() {
    //not important
  }

  public void getY() {
    //not important
  }
}

الآن المشكلة هي عندما تقوم JBPM بتحميل old كائن ProcessData المخزنة ، نحصل على استثناءCaused by: java.io.InvalidClassException: my.package.ProcessData; local class incompatible: stream classdesc serialVersionUID = 6651422488035743444, local class serialVersionUID = -7966721901330644987

الآن سؤالي هو ، كيف يمكننا حل هذه المشكلة؟ كيف يمكننا أن نجعل قراءة الكائن المسلسل ونوع من تحويله في هذه الفئة الجديدة. هل هذا ممكن؟ تذكر أن لدينا سيطرة محدودة على مكتبة JBPM.

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

المحلول

يبدو أنك لا تستخدم رمز العينة في كلتا الحالتين ، لأنه في مثالك ، تقوم بتحديد SerialVersionuid (هذا جيد) وهو نفسه قبل وبعد ، ولكن في خطأك ، تختلف UID. لكي يحدث هذا ، لا يتم تعريف UID (تم إنشاؤه) ، أو تم تغييره بين الإصدارات. ستؤدي الحالة التي تم إنشاؤها أيضًا إلى حدوث تغيير بين الإصدارات لأن توقيعات الفصل مختلفة.

في كلتا الحالتين ، سيكون هذا هو السلوك المتوقع.

يبدو أن الرمز الحقيقي الذي يتم تشغيله لا يتطابق فعليًا مع مثالك. لتحميل الكود القديم ، سيتعين عليك تعيين UID في الإصدار الجديد لتتناسب مع الإصدار الموجود بالفعل في الفئات المستمرة (6651422488035743444L). أيضًا ، من الأسهل إدارة UID إذا كنت تستخدم أرقامًا بسيطة ، مثل الإصدارات 1،2،3.

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