как сериализовать класс? - PullRequest
10 голосов
/ 05 января 2012

Когда я вставляю список в 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, поэтому, пожалуйста, помогите мне.

Ответы [ 8 ]

7 голосов
/ 05 января 2012

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

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

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

Возможно, вам будет интересно прочитатьэто: Откройте для себя секреты Java Serialization API

1 голос
/ 06 апреля 2015

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

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

extends BasicDBObject 

Оригинальный источник

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

0 голосов
/ 15 марта 2016

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

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

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

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

....
PersonList personList = new PersonList();
personList.person = new ArrayList<>();
// add persons to the list
....
....
record.put("personsList", personList);
....
// rest of your code
0 голосов
/ 02 января 2015

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

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

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

....

ObjectMapper mapper = new ObjectMapper();
DBObject dboJack = mapper.convertValue(new Person("Jack"), BasicDBObject.class);
...
0 голосов
/ 20 июля 2014

Вот пример кода для сериализации объекта 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
public 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");

        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());
    }
}
0 голосов
/ 05 января 2012

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

0 голосов
/ 05 января 2012

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

class Person implements Serializable {
   //Rest here
}

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

0 голосов
/ 05 января 2012

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

class Person implements Serializable

...