簡體   English   中英

HashMap 不可序列化

[英]HashMap not Serializable

帶有Serializable鍵/值的HashMap應該是Serializable

但這對我不起作用。 嘗試了一些其他的 IO 流。 沒有工作。

有什么建議嗎?

測試代碼

public class SimpleSerializationTest {
    @Test
    public void testHashMap() throws Exception {
        HashMap<String, String> hmap = new HashMap<String, String>() {{
            put(new String("key"), new String("value"));
        }};

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutput out = null;
        out = new ObjectOutputStream(bos);
        out.writeObject(hmap);
        byte[] yourBytes = bos.toByteArray();
        if (out != null) {
            out.close();
        }
        bos.close();

        ByteArrayInputStream bis = new ByteArrayInputStream(yourBytes);
        ObjectInput in = null;
        in = new ObjectInputStream(bis);
        Object o = in.readObject();
        bis.close();
        if (in != null) {
            in.close();
        }

        assertEquals(hmap, o);
    }
}

堆棧跟蹤

java.io.NotSerializableException: SimpleSerializationTest
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at SimpleSerializationTest.testHashMap(SimpleSerializationTest.java:18)

Process finished with exit code 0

異常消息准確地告訴您問題是什么:您正在嘗試序列化SimpleSerializationTest類的實例,而該類不可序列化。

為什么? 好吧,您已經創建了SimpleSerializationTest的匿名內部類,它擴展了HashMap ,並且您正在嘗試序列化該類的實例。 內部類始終引用其外部類的相關實例,默認情況下,序列化將嘗試遍歷這些實例。

我觀察到您使用雙括號{{ ... }}語法,好像您認為它具有某種特殊意義。 重要的是要了解它實際上是兩個獨立的結構。 在構造函數調用之后立即出現的外部大括號標記了內部類定義的邊界。 內部對綁定了一個實例初始化塊,例如您可以在任何類主體中使用(盡管它們在匿名內部類以外的上下文中是不常見的)。 通常,您還會在外部對中包含一個或多個方法實現/覆蓋,無論是在初始化程序塊之前還是之后。

試試這個:

    public void testHashMap() throws Exception {
        Map<String, String> hmap = new HashMap<String, String>();

        hmap.put(new String("key"), "value");

        // ...
    }

您的代碼的工作版本:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashMap;

import org.junit.Test;

import junit.framework.Assert;

public class SimpleSerializationTest implements Serializable{
    @Test
public void testHashMap() throws Exception {
    HashMap<String, String> hmap = new HashMap<String, String>() {{
        put(new String("key"), new String("value"));
    }};

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutput out = null;
    out = new ObjectOutputStream(bos);
    out.writeObject(hmap);
    byte[] yourBytes = bos.toByteArray();
    if (out != null) {
        out.close();
    }
    bos.close();

    ByteArrayInputStream bis = new ByteArrayInputStream(yourBytes);
    ObjectInput in = null;
        in = new ObjectInputStream(bis);
        HashMap<String, String> o = (HashMap<String, String>) in.readObject();
        bis.close();
        if (in != null) {
            in.close();
        }

        Assert.assertEquals(hmap, o);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM