【问题标题】:NotSerializableException when classes implement Serializable [duplicate]NotSerializableException 当类实现 Serializable [重复]
【发布时间】:2017-07-27 16:44:22
【问题描述】:

TL;DR

当我尝试反序列化 PullSheet 对象(下面的类)时,我得到一个 java.io.NotSerializableException。我哪里错了?

编辑:向问题类添加空构造函数后,我现在得到一个“不兼容”异常。

堆栈跟踪:

java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:606)
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1623)
java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1772)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
com.campusden.learning.movingdata.ScannerActivity.loadSheet(ScannerActivity.java:271)
com.campusden.learning.movingdata.ScannerActivity.onCreate(ScannerActivity.java:79)
android.app.Activity.performCreate(Activity.java:6679)
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
android.app.ActivityThread.-wrap12(ActivityThread.java)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
android.os.Handler.dispatchMessage(Handler.java:102)
android.os.Looper.loop(Looper.java:154)
android.app.ActivityThread.main(ActivityThread.java:6119)
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

问题

我正在尝试序列化 PullSheet 对象,以便存储简单的数据备份并作为用户的功能要求。我能够毫无例外地序列化对象,但是当我尝试反序列化时,我在 PullItem 类上得到一个 java.io.NotSerializableException。

代码

PullSheet.java

import ...

public class PullSheet implements Serializable{

protected String pullerName;
protected String role;
protected String store;
protected String sheetId;
protected String runItId;
protected String date;
protected UUID uuid;
protected String serialName;
protected Long startTime = System.currentTimeMillis();
protected ArrayList<PullItem> SheetItems = new ArrayList<PullItem>();


public void createSheet(String _pullerName, String _role, String _store, String _runItId){
    setPullerName(_pullerName);
    setRole(_role);
    setStore(_store);
    setRunItId(_runItId);
    setSerialName();
    setDate();
    setUuid();
    setSheetId();
}

protected void addItem(String sku, Integer qty){
    SheetItems.add(new PullItem(sku, qty));
}
protected void removeItem(PullItem item){
    this.SheetItems.remove(item);
}

//Getters and setters

public String getPullerName(){ return pullerName; }
public String getRole(){ return role; }
public String getStore(){ return store; }
public String getRunItId(){ return runItId; }
public String getSheetId(){ return sheetId; }
public Long getStartTime(){ return startTime; }
public UUID getUuid() { return uuid; }


private void setPullerName(String _pullerName){ pullerName = _pullerName; }
private void setRole(String _role){ pullerName = _role; }
private void setStore(String _store){ store = _store; }
private void setRunItId(String _runItId){ runItId = _runItId; }
private void setSerialName(){ serialName = this.store + "-" + this.date + "_" + this.uuid; }
private void setUuid(){ uuid = UUID.randomUUID(); }
private void setDate() {
    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
    this.date = formatter.format(new Date(this.startTime));
}

private void setSheetId(){

    String randUUID = uuid.toString();
    sheetId = this.date + "-" + this.store + "-" + this.pullerName + "-" + randUUID + "-" + this.runItId;

}

}

PullItem.java

import ...

public class PullItem implements Serializable {

protected String sku;
protected Integer qty;


public PullItem(String sku, Integer qty) {
    setSku(sku);
    setQty(qty);
}

public PullItem(String sku) {
    setSku(sku);
    this.qty = 1;
}


String getSku(){
    return sku;
}

Integer getQty(){
    return qty;
}

void setSku(String _sku){
    sku = _sku;
}

void setQty(Integer _qty){
    qty = _qty;
}
void incrementQty(){
    qty += 1;
}
}

序列化和反序列化 PullSheet 对象的函数:

public static boolean saveSheet(Context context, PullSheet sheet){
    String fileName = "saved.szs";
    try {
        FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        Log.d("rep", fileName);
        oos.writeObject(sheet);
        oos.close();
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }

    return true;
}

public static PullSheet loadSheet(Context context, String fileName) {
    try {
        FileInputStream fis = context.openFileInput(fileName);
        ObjectInputStream is = new ObjectInputStream(fis);
        Object readObject = is.readObject();
        is.close();

        if(readObject != null && readObject instanceof PullSheet) {
            return (PullSheet) readObject;
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    return null;
}

我需要什么

请告诉我哪里出错了。我认为这不是导致异常的类型,因为所有类都实现了 Serializable,但我可能会离开。在此先感谢您的帮助

【问题讨论】:

  • 你能不能尝试定义一个空的构造函数
  • 你传递PullSheet的子类吗?
  • “我得到一个 java.io.NotSerializableException”——请编辑您的问题并提供与此异常相关的完整 Java 堆栈跟踪。
  • 添加空构造函数添加“本地类不兼容:stream classdsc serialversionUID = x
  • 对不起,我忽略了,它在 readObject 中。因此,您可能正在尝试加载以前保存的内容,然后添加了一些变量,或者由于您尚未定义 serialVersionUUID,因此无法反序列化对象,可能是因为现在计算的 serialVersionUUID 是与以前的不同。

标签: java android serialization


【解决方案1】:

序列化时它没有实现Serializable。你当时有一个例外。你修复了它以实现Serializable。然后您尝试反序列化旧流。它不起作用。

编辑

在向问题类添加空构造函数后,我现在得到一个“不兼容”异常。

因为你改变了隐含的serialVersionUIDSerializable 类中不需要空构造函数。

编辑 2

这里的一些人似乎没有意识到,当您尝试序列化不可序列化的对象时,NotSerializableException 被 (1) 抛出并 (2) 以这样一种方式写入数据流,当您到达它时使用readObject() 读取时,它会再次被抛出,正如 OP 的堆栈跟踪中所示。

【讨论】:

  • 这将给出一个不兼容的异常(不记得确切的名称),NotSerializableException 是当您尝试序列化您无法序列化的东西时
  • 这正是问题所在。你一定有 esp,但我忘记了在我记得在我的 PullItems 上实现可序列化之前我已经保存了数据。一百万谢谢!
  • @LunarWatcher 在我添加了一个空的构造函数后,它确实给出了不兼容的异常,忘记将其编辑到问题中。
  • @mtrueblood 我没有 ESP。它发生在readObject() 而不是writeObject() 的事实告诉了我这一切。
  • @LunarWatcher 换句话说,您还没有尝试过。在进一步辩论之前这样做。
猜你喜欢
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 2018-04-29
  • 2015-01-27
  • 2012-03-05
相关资源
最近更新 更多