Как сериализовать класс?
Когда я вставляю 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.