Проблема сериализации в Java - PullRequest
3 голосов
/ 09 июля 2011

У меня есть тип данных, который содержит длинные метки времени, hashmap, Set и другой двойной массив. Я сериализовал этот тип данных и не получил никаких исключений во время работы, однако, когда я читаю этот файл, карта и двойной массив оказываются нулевыми? По сути, я могу распечатать числа на консоль перед записью, но двойные массивы и карта нулевые. Извините, если я плохо это объяснил. Я работал над этим некоторое время сейчас ...

В чем проблема? Что такое классы NotSerializable? Есть ли способ сделать его сериализуемым?

Спасибо, что нашли время.

Ответы [ 5 ]

1 голос
/ 09 июля 2011

Этот ответ может быть слишком простым, но проверьте, не являются ли ваши поля переходными или статическими .

1 голос
/ 09 июля 2011

вам нужно сделать сериализуемый класс путем реализации интерфейса сериализации в пакете java.io;и это выглядело бы примерно так

    import java.io.Serializable;

    public class YourClassNameHere implements Serializable
    {
          //your class code and methods would go here
    }

, это довольно легко решило бы вашу проблему.

0 голосов
/ 09 июля 2011

Я столкнулся с Collection с разрешением до null раньше, когда сериализованный Collection пуст. Хитрость заключается в том, чтобы определить метод Object readResolve() в вашем классе, который вызывается инфраструктурой сериализации после чтения объекта из источника данных. Отсюда вы можете вернуть новый экземпляр вашего класса с нулевыми значениями, замененными реальными пустыми Collection. Так что-то вроде:

public class MyClass implements Serializable {
    private final Map<String,String> foo;
    public MyClass() {
        foo = new HashMap<String,String>();
    }
    public MyClass(final Map<String,String> foo) {
        this.foo = new HashMap<String,String>(foo);
    }
    ...
    public Object readResolve() {
        return (foo == null ? new MyClass() : new MyClass(foo));
    }
}

Копирование других полей, которые вы определили, как необходимо.

0 голосов
/ 09 июля 2011

Вы должны сделать ваш класс сериализуемым:

public class YourClass implements java.io.Serializable
{

}
0 голосов
/ 09 июля 2011

И HashMaps, и массивы примитивов (double) могут быть сериализуемы. Возможно ли, что в вашем HashMap есть объекты, которые не помечены как Serializable? Трудно сказать, не глядя на код.

Вот быстрый пример ---

import java.io.*;
import java.util.*;

public class Ser {
    public static void main(String[] args) throws Exception {

        // Serialize an int[]
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("test.ser"));
        out.writeObject(new double[] {3.1, 1.1});
        out.flush();
        out.close();

        out = new ObjectOutputStream(new FileOutputStream("test1.ser"));
        HashMap<String, String> aa = new HashMap<String, String>();
        aa.put("bla" , "bla1");
        out.writeObject(aa);
        out.flush();
        out.close();

        // Deserialize the int[]
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("test.ser"));
        double[] array = (double[]) in.readObject();
        in.close();

        // Print out contents of deserialized int[]
        System.out.println("It is " + (array instanceof Serializable) + " that we can serialize double[]");
        for (int i=0; i<array.length; i++) {
            System.out.print(", " + array[i]);
        }
        System.out.println();

        in = new ObjectInputStream(new FileInputStream("test1.ser"));
        HashMap<String, String> bb = (HashMap<String, String>) in.readObject();
        in.close();

        // Print out contents of deserialized int[]
        System.out.println("It is " + (bb instanceof Serializable) + " that we can serialize HashMap");
        System.out.print(bb);
        System.out.println();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...