Как сериализовать класс?

Когда я вставляю List в mongodb, возникает проблема:

Exception in thread "main" java.lang.IllegalArgumentException: can't serialize class mongodb.Person
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:234)
    at org.bson.BasicBSONEncoder.putIterable(BasicBSONEncoder.java:259)
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:198)
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:140)
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:86)
    at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:27)
    at com.mongodb.OutMessage.putObject(OutMessage.java:142)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:252)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:211)
    at com.mongodb.DBCollection.insert(DBCollection.java:57)
    at com.mongodb.DBCollection.insert(DBCollection.java:87)
    at com.mongodb.DBCollection.save(DBCollection.java:716)
    at com.mongodb.DBCollection.save(DBCollection.java:691)
    at mongodb.MongoDB.main(MongoDB.java:45)

класс Person определяется следующим образом:

class Person{
    private String name;
    public Person(String name){
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

Программа:

        DBCollection coll = db.getCollection("test");
        DBObject record = new BasicDBObject();
        List<Person> persons= new ArrayList<Person>();
        persons.add(new Person("Jack"));
        record.put("person", persons);
        coll.save(record);

Я не могу найти ответ из Google, поэтому, пожалуйста, помогите мне.

Ответ 1

Просто реализуйте Serializable интерфейс в классе Person.

Также будет полезно определить serialVersionUID в вашем классе.

AFAIK, создавая класс POJO в java, класс должен быть сериализуемым, если он будет передан через некоторый поток, иметь конструктор по умолчанию и разрешает доступ к свойствам/полям с использованием методов getter и setter.

Вам может быть интересно прочитать это: Откройте секреты API Java Serialization

Ответ 2

У меня такое же исключение, работая с mongodb. Я попытался сделать серию проблемных классов сериализуемыми, но это не помогло решить мою проблему.

Следующее - это то, что сработало для меня. Расширьте класс как дочерний объект BasicDBObject. Конечно, это работает, только если проблема вызвана MongoDB.

extends BasicDBObject 

Исходный источник

http://techidiocy.com/cant-serialize-class-mongodb-illegal-argument-exception/#comment-1298

Ответ 3

Класс должен реализовывать интерфейс java.io.Serializable.

class Person implements Serializable

Ответ 4

Для определения класса Person должно быть implements Serializable для его сериализации, например:

class Person implements Serializable {
   //Rest here
}

Вот некоторые полезные ссылки на сериализацию объектов Java: Ссылка, Ссылка.

Ответ 5

Вот пример кода, чтобы сделать объект Employee сериализованным:

public class Employee implements Serializable {

    private int empId;
    private String name;

    public int getEmpId() {
        return empId;
    }

    public String getName() {
        return name;
    }

    public void setEmpId(int empId) {
        this.empId = empId;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "EMployee id : " + empId + "  \nEmployee Name : " + name;
    }
}
    //Another Main Class
    pubic class Main{
        public static void main(String[] args) throws FileNotFoundException, IOException,   ClassNotFoundException {

            String filename = "data.txt";
            Employee e = new Employee();
            e.setEmpId(101);
            e.setName("Yasir Shabbir");
        enter code here
            FileOutputStream fos = null;
            ObjectOutputStream out = null;

            fos = new FileOutputStream(filename);
            out = new ObjectOutputStream(fos);
            out.writeObject(e);

            out.close();


            // Now to read the object from file
            // save the object to file
            FileInputStream fis = null;
            ObjectInputStream in = null;

            fis = new FileInputStream(filename);
            in = new ObjectInputStream(fis);
            e = (Employee) in.readObject();
            in.close();

            System.out.println(e.toString());
        }
    }
}

Ответ 6

Проблема здесь не в "реализует Serializable". Проблема заключается в том, что объект не преобразован в DBObject.

Возможное решение:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.mongodb.*;

....

ObjectMapper mapper = new ObjectMapper();
DBObject dboJack = mapper.convertValue(new Person("Jack"), BasicDBObject.class);
...

Ответ 7

Вы можете добиться этого, используя следующий код:

import com.google.gson.annotations.Expose;
import com.mongodb.ReflectionDBObject;

class PersonList extends ReflectionDBObject {
    // person property
    @Expose public java.util.List<Person> person;
}

Теперь в вашем коде mongodb вы можете сериализовать список Person следующим образом

....
PersonList personList = new PersonList();
personList.person = new ArrayList<>();
// add persons to the list
....
....
record.put("personsList", personList);
....
// rest of your code

Ответ 8

Прежде всего, вы должны знать, почему вы делаете класс Serializable? Всякий раз, когда вы хотите переместить obeject в сеть в файл, базу данных, сеть, процесс или любую другую систему. В java простой реализации. Просто выполните интерфейс Serializable.