2012-01-05 10 views
10

Al insertar una lista en mongodb, hay un problema:cómo serializar la clase?

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) 

la clase Persona se define como sigue:

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; 
    } 
} 

El programa es:

 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); 

que pueda No encuentras la respuesta de google, así que por favor ayudame.

+0

cómo hiciste esto @ vienna ... Por favor, ayúdame, estoy teniendo el mismo problema. Por favor ayuda – shalki

+0

Una observación: uno de los beneficios de MongoDB es la capacidad de evolucionar el esquema en el tiempo sin tener que actualizar los documentos existentes con estos nuevos campos. Por lo tanto, puede querer almacenar sus objetos como documentos (es decir, con un campo para el nombre, etc.), o si realmente desea hacer una serialización binaria, es posible que prefiera usar algo como Google Protocol Buffers, que es más a prueba de futuro forma de lograr la serialización binaria. – Rich

Respuesta

7

Simplemente implemente la interfaz Serializable en la clase Person.

También será bueno definir un serialVersionUID en su clase.

AFAIK, al crear la clase POJO en java, la clase debería ser serializable, si se va a transferir a través de una secuencia, tener un constructor predeterminado y permitir el acceso a propiedades/campos utilizando los métodos getter y setter.

Usted podría estar interesado en leer este: Discover the secrets of the Java Serialization API

+1

Pero todavía tengo el problema aunque implemente la interfaz Serializable; clase La persona implementa Serializable { \t private String name; \t public Person (String name) { \t \t this.name = name; \t} \t public String getName() { \t \t return name; \t} \t public void setName (String name) { \t \t this.name = name; \t} } – NOrder

+0

@vienna: ¿Recibió la misma excepción o alguna otra? –

+0

sí, tengo la misma excepción – NOrder

0

persona de clase debe implementar la interfaz java.io.Serializable.

class Person implements Serializable

0

Su definición de clase Person necesita tener implements Serializable a fin de que se va a serializar, por ejemplo .:

class Person implements Serializable { 
    //Rest here 
} 

Estos son algunos enlaces útiles en la serialización de objetos de Java: Link, Link.

-1

Antes que nada, ¿sabes por qué haces clase Serializable? Siempre que desee mover obeject en la red a un archivo, base de datos, red, proceso o cualquier otro sistema. En implementación Java simple. Solo implemente la interfaz Serializable.

0

Aquí está el ejemplo de código para hacer objeto Empleado serializado:

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

El problema aquí no en "implementa Serializable". El problema es que el objeto no se convierte en DBObject.

Posible solución:

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

.... 

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

Esto se puede conseguir mediante el uso de código siguiente:

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

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

Ahora en su código mongodb, puede serializar una lista Persona de la siguiente manera

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