2

これは、バイト配列にシリアライズされようとしているクラスです。

public class DummyClass implements Serializable
{
    private static transient final long serialVersionUID    = -8483859843874771619L;
    public String   y;

    public DummyClass(String y)
    {
        this.y = y;
    }
    public String getY()
    {
        return this.y;
    }
}

これはシリアライゼーション実行テストです

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutput out = null;
    byte[] bs = null;
    try
    {
        DummyClass dummyClass = new DummyClass("World I Salute you");
        out = new ObjectOutputStream(bos);
        out.writeObject(dummyClass); // <--- Throws exception here
        bs = bos.toByteArray();
    }
    finally
    {
        out.close();
        bos.close();
    }

そしてスタックトレースに関して:

java.io.NotSerializableException: tests.DummyClassTest
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at tests.DummyClassTest.dummyTest(DummyClassTest.java:109)

明らかな質問は、私が間違っていることは何ですか?

乾杯。

編集

クラス全体

public class DummyClassTest
{
    public class DummyClass implements Serializable
    {
        private static transient final long serialVersionUID    = -8483859843874771619L;
        public String   y;

        public DummyClass(String y)
        {
            this.y = y;
        }
        public String getY()
        {
            return this.y;
        }
    }

    @Test
    public void dummyTest() throws IOException
    {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutput out = null;
        byte[] bs = null;
        try
        {
            DummyClass dummyClass = new DummyClass("World I Salute you");
            out = new ObjectOutputStream(bos);
            out.writeObject(dummyClass);
            bs = bos.toByteArray();
        }
        finally
        {
            out.close();
            bos.close();
        }
    }
}
4

1 に答える 1

8

非静的内部クラスには、その外部クラスインスタンスへの暗黙の参照があります。したがって、DummyClassをシリアル化すると、それを所有するDummyClassTestインスタンスへのこの暗黙の参照もシリアル化されます。

DummyClassをトップレベルクラス(ネストされていない)または静的内部クラスとして定義すると、すべてが期待どおりに機能します。

以下:

public class DummyClassTest {
    public class DummyClass {
    }
}

多かれ少なかれ同等です

public class DummyClassTest {
}

public class DummyClass {
    private DummyClassTest outerInstance;
}
于 2012-11-16T07:57:24.077 に答える