Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法序列化哈希映射_Java_Android_Serialization - Fatal编程技术网

Java 无法序列化哈希映射

Java 无法序列化哈希映射,java,android,serialization,Java,Android,Serialization,我试图序列化一个HashMap,但它抛出了NotSerializableException 我将HashMap声明为: HashMap<String, Profile> profiles = new HashMap<String, Profile>(); Profile.java 元素的初始化方式如下: Profile profile = new Profile() {{ name = "SOMETHING"; useSSL = false; /

我试图序列化一个
HashMap
,但它抛出了
NotSerializableException

我将
HashMap
声明为:

HashMap<String, Profile> profiles = new HashMap<String, Profile>();
Profile.java

元素的初始化方式如下:

Profile profile = new Profile() {{
    name = "SOMETHING";
    useSSL = false;
    // etc. etc.
}};
日志:


编辑

  • Profile
    类在单独的文件中定义,而不是在内部类中定义

  • 下面是saveObject()和loadObject()方法


如果Profile是MainActivity的嵌套类,则将其声明为static。(除此之外,我不认为序列化框架会尝试序列化MainActivity的原因。)如果不是这样,请发布更多来自MainActivity的代码,包括saveObject,我们将更新答案


非静态嵌套类具有对其容器类的隐式引用。因此,序列化框架将尝试序列化您的MainActivity。

最后,我能够解决我的问题

我将对象变量设置为:

Profile profile = new Profile() {{
    name = "SOMETHING";
    useSSL = false;
    // etc. etc.
}};
所以我只是尝试在不使用双括号的情况下设置变量,如:

profile.name = " SOMETHING";
profile.useSSL = false;
// etc. etc.

我甚至不知道为什么会出现这个问题,但最后我已经解决了。

如何编写HashMap?@Blackbelt通过objectOutput#writeObject(profiles)然后我刷新流我真的想知道为什么这个问题被否决,我就是不明白你能发布方法saveObject吗?你确定Profile不是
MainActivity
的内部类吗?如果是,则需要声明它为静态。否则,我看不出序列化框架试图序列化
MainActivity
的原因。尝试从MainActivity发布更多代码。。。包含saveObjectIt是由于创建了一个内部类而导致问题的,该类具有对封闭对象的引用,该对象不可序列化。使用双括号本质上是Profile的一个匿名内部子类,即Profile不再严格属于Profile类型。也因为它是一个非静态的内部类,所以它有一个对其封闭对象的引用,这是不可序列化的;你应该避免。我曾在一些地方将其视为“整洁的技巧”,您通常应该将其视为:整洁的技巧,不适用于真正的代码(棘手的代码往往会导致棘手的bug)。“非静态内部”是一种重言式。
java.io.NotSerializableException: tk.microdroid.microirc.MainActivity
        at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
        at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
        at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
        at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
        at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
        at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
        at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
        at java.util.HashMap.writeObject(HashMap.java:1013)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1053)
        at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
        at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
        at tk.microdroid.microirc.MainActivity.saveObject(MainActivity.java:168)
        at tk.microdroid.microirc.MainActivity.saveDefaultProfiles(MainActivity.java:201)
        at tk.microdroid.microirc.MainActivity.checkFirstStartup(MainActivity.java:70)
        at tk.microdroid.microirc.MainActivity.onCreate(MainActivity.java:43)
        at android.app.Activity.performCreate(Activity.java:4465)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
        at android.app.ActivityThread.access$600(ActivityThread.java:127)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4448)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
        at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
        at dalvik.system.NativeStart.main(Native Method)
public Object loadObject(String name) {
    try {
        ObjectInputStream objectInput = new ObjectInputStream(openFileInput(name));
        Object obj = objectInput.readObject();
        objectInput.close();
        Log.v("loadObject()", "Loading " + name + ".. | Type: " + obj.getClass().getName());
        return obj;
    } catch (Exception e) { Log.e("loadObject()", e.toString()); }
    return null;
}

public void saveObject(Object obj, String name) {
    try {
        Log.v("saveObject()", "Saving " + name + ".. | Type: " + obj.getClass().getName());
        ObjectOutputStream objectOutput = new ObjectOutputStream(openFileOutput(name, MODE_PRIVATE));
        objectOutput.writeObject(obj);
        objectOutput.flush();
        objectOutput.close();
    } catch (Exception e) { Log.e("saveObject()","Error", e); }
}
Profile profile = new Profile() {{
    name = "SOMETHING";
    useSSL = false;
    // etc. etc.
}};
profile.name = " SOMETHING";
profile.useSSL = false;
// etc. etc.