java - 当类实现 Serialized 时出现 NotSerializedException

标签 java android serialization

TL;DR

当我尝试反序列化 PullSheet 对象(下面的类)时,出现 java.io.NotSerializedException。我哪里出错了?

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

堆栈跟踪:

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 对象,以便存储简单的数据备份并作为用户的功能要求。我能够毫无异常(exception)地序列化该对象,但是当我尝试反序列化时,我在 PullItem 类上收到 java.io.NotSerializedException。

代码

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。那时你有一个异常(exception)。您修复了它以实现Serialized。然后您尝试反序列化旧流。这不起作用。

编辑

After adding an empty constructor to the problem class I am now getting an "incompatible" exception.

因为您更改了隐式serialVersionUIDSerialized 类中不需要空构造函数。

编辑2

这里的一些人似乎没有意识到,当您尝试序列化一个不可序列化的对象时,NotSerializedException 会 (1) 抛出并 (2) 写入数据流,其方式如下:当您使用 readObject() 读取时到达它,它会再次抛出,与 OP 的堆栈跟踪中所示完全相同。

关于java - 当类实现 Serialized 时出现 NotSerializedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45356593/

相关文章:

java - 如何在 Jasper Report 中动态显示列?

java - 如何在运行时转换包含groovy表达式的纯java字符串?

java - 在浏览器中加载时更改 URL - Android Studio

android - 为什么微调监听器需要 onNothingSelected 方法?

c# - 反序列化 JSON Objest 导致所有空字段 C#

java - 是否有任何类似于 HashMap 的数据结构,我可以在其中添加重复键

java - 这个 LogCat 错误是什么意思?

java - Android KSOAP2 请求到 PHP SOAP 服务器

java - 使用开源版本的CoreNLP时无法加载OpenIE模型

swift - 有没有办法对闭包进行编码和解码?