2012-01-05 3 views
10

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

+0

как ты сделал это @vienna .. Plz помогите мне, у меня такая же проблема. Справка Plz – shalki

+0

Замечание: одним из преимуществ MongoDB является способность разрабатывать схему с течением времени без необходимости обновления существующих документов этими новыми полями. Поэтому вы можете хранить свои объекты в виде документов (т. Е. С полем для имени и т. Д.), Или если вы действительно хотите выполнить двоичную сериализацию, вы можете использовать что-то вроде буферов протокола Google, что является более надежным в будущем способ достижения двоичной сериализации. – Rich

ответ

7

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

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

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

Вы могли бы быть заинтересованы в чтении этого: Discover the secrets of the Java Serialization API

+1

Но у меня все еще есть проблема, даже если я реализую интерфейс Serializable; class Person реализует Serializable { \t private Название строки; \t общественное лицо (название строки) { \t \t this.name = имя; \t} \t public String getName() { \t \t имя на назад; \t} \t public void setName (String name) { \t \t this.name = имя; \t} } – NOrder

+0

@ vienna: Вы получили то же исключение или любое другое? –

+0

да, у меня такое же исключение – NOrder

0

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

class Person implements Serializable

0

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

class Person implements Serializable { 
    //Rest here 
} 

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

-1

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

0

Вот пример кода, чтобы сделать объект 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()); 
     } 
    } 
} 
0

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

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

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

.... 

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

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

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

extends BasicDBObject 

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

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

0

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

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 
Смежные вопросы