【问题标题】:My class java has suddenly become un-serializable我的类 java 突然变得不可序列化
【发布时间】:2011-05-08 23:07:06
【问题描述】:

我的一个班级突然开始抱怨它不可序列化。 我已经更改了其中的一些内容,但在其定义中看不到任何可能导致它的内容。

我得到了那个类的 notserializableexception。

这些是课程开始时的所有定义,我看不到任何会导致问题的内容。

private static final long serialVersionUID = 1L;
private ArrayList <Card> cards;
private ArrayList <Card> selectedCards;
private HashSet <Card> knownCards;
private ArrayList <Card> aceHighs;
private int numberOfKnownCards = 0;
private int valueOfKnownCards = 0;

public static final int sortHand = 1;
public static final int sortSelectedCards = 2;
protected int[] cardsPerSuit = {0,0,0,0}; 
private int numberOfDifferentSuits = 0;
private int[] cardsPerRank = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
private int numberOfDifferentRanks = 0;



private int whereToTakeFrom;
private int whichDiscardToTake;

private int cardCount = 0;
private int selectedCount = 0;
public  int handValue = 0;
private Deck deck;

堆栈:

05-08 23:46:42.235: DEBUG/AndroidRuntime(1625): Shutting down VM
05-08 23:46:42.235: WARN/dalvikvm(1625): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
05-08 23:46:42.235: ERROR/AndroidRuntime(1625): Uncaught handler: thread main exiting due to uncaught exception
05-08 23:46:42.265: ERROR/AndroidRuntime(1625): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = il.co.anykey.games.yaniv.lite.AutomatedPlayer)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at android.os.Parcel.writeSerializable(Parcel.java:1131)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at android.os.Parcel.writeValue(Parcel.java:1085)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at android.os.Parcel.writeMapInternal(Parcel.java:469)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at android.os.Bundle.writeToParcel(Bundle.java:1445)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at android.os.Parcel.writeBundle(Parcel.java:483)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at android.app.ActivityManagerProxy.activityPaused(ActivityManagerNative.java:1427)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3106)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at android.app.ActivityThread.access$2400(ActivityThread.java:119)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1870)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at android.os.Looper.loop(Looper.java:123)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at android.app.ActivityThread.main(ActivityThread.java:4363)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.lang.reflect.Method.invokeNative(Native Method)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.lang.reflect.Method.invoke(Method.java:521)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at dalvik.system.NativeStart.main(Native Method)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625): Caused by: java.io.NotSerializableException: il.co.anykey.games.yaniv.lite.Hand$1
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1547)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1854)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1696)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1660)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1854)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1696)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1660)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1215)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1215)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1854)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1696)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1660)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1215)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1854)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1696)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1660)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1215)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1854)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1696)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1660)
05-08 23:46:42.265: ERROR/AndroidRuntime(1625):     at java.io.ObjectOutputStream.write
05-08 23:46:42.316: WARN/ActivityManager(63): Activity pause timeout for HistoryRecord{44d2c128 il.co.anykey.games.yaniv.lite/.YanivGameActivity}
05-08 23:46:42.335: INFO/Process(63): Sending signal. PID: 1625 SIG: 3
05-08 23:46:42.345: INFO/dalvikvm(1625): threadid=7: reacting to signal 3
05-08 23:46:42.396: INFO/dalvikvm(1625): Wrote stack trace to '/data/anr/traces.txt'
05-08 23:46:51.852: WARN/ActivityManager(63): Launch timeout has expired, giving up wake lock!
05-08 23:46:52.395: WARN/ActivityManager(63): Activity idle timeout for HistoryRecord{44d2d728 il.co.anykey.games.yaniv.lite/.YanivSettingsActivity}

这些是我拥有的两个比较器,它们可能会造成问题:

private Comparator<Card> byRank = new Comparator<Card>()  {

public int compare(Card c1, Card c2) {
   return c2.getCardRank()-c1.getCardRank();
}
};

private Comparator<Card> bySuitAndRank = new Comparator<Card>()  {

public int compare(Card c1, Card c2) {
   return (c1.getCardSuit()-c2.getCardSuit())*100 + c2.getCardRank()-c1.getCardRank();
}
};

【问题讨论】:

  • 它是否有一个公共的、无参数的构造函数?
  • CardDeck 还是Serializable
  • 你实现可序列化了吗?如果是这样,您是否更改了serialVersionUID 的值?此外,UID 为 1 也不是一个很好的选择 ....
  • 是的。虽然 Card 没有非参数构造函数(对它来说毫无意义)。不过,一直都是这样。
  • 向我们展示完整的堆栈跟踪。这可能会提供更多关于问题所在的线索。

标签: java android serialization


【解决方案1】:

根据堆栈跟踪,il.co.anykey.games.yaniv.lite.Hand$1 类(Hand 内部的匿名类)不可序列化。

【讨论】:

  • 我确实有几个内部类,但我认为它们是问题所在,所以我将它们移到外部文件中。现在没有了。
  • 但是堆栈跟踪确实抱怨该类。它不仅仅是一个内部类,它是一个匿名类。你检查过吗?这是new Foo(){ /* ...methods/fields... */ } 之类的任何东西。
  • 这似乎是问题所在。我更改了代码,以便在使用比较器时而不是提前创建比较器。完美运行。非常感谢!
  • 很高兴您解决了这个问题并感谢您的投票 :) 我认为您可以通过例如创建一个接口 interface CompSer&lt;T&gt; extends Comparator&lt;T&gt;, Serializable 并实现它而不是普通的 Comparator 来使比较器可序列化。
  • 只是为了扩展,每当您使用new“将代码放入变量”时,就像比较器、可运行对象和侦听器通常的情况一样,java 编译器会创建一个匿名 [inner] 类,表示它。
【解决方案2】:

尝试将有问题的字段标记为transient。也许您可以稍后在反序列化时重建它们。

【讨论】:

  • 我尝试遍历所有字段并一次标记几个临时字段。仍然没有帮助。
猜你喜欢
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多