2012-01-05 63 views
10

Khi tôi chèn một danh sách vào MongoDB, có một vấn đề:cách sắp xếp lớp học?

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) 

Người lớp được định nghĩa như sau: Chương trình

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

là:

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

tôi có thể 't tìm câu trả lời từ google, vì vậy hãy giúp tôi.

+0

làm thế nào u làm điều này @vienna .. Plz giúp tôi Tôi gặp vấn đề tương tự. Trợ giúp Plz – shalki

+0

Quan sát: một trong những lợi ích của MongoDB là khả năng phát triển lược đồ theo thời gian mà không phải cập nhật tài liệu hiện có với các trường mới này. Do đó, bạn có thể lưu trữ các đối tượng của mình dưới dạng tài liệu (ví dụ với trường cho tên, v.v.), hoặc nếu bạn thực sự muốn thực hiện tuần tự nhị phân, bạn có thể thích sử dụng một thứ gì đó như Bộ đệm giao thức của Google. cách để đạt được serialization nhị phân. – Rich

Trả lời

7

Chỉ cần triển khai giao diện Serializable trong lớp Person.

Ngoài ra, bạn nên xác định số serialVersionUID trong lớp học của mình.

AFAIK, khi tạo lớp POJO trong java, lớp sẽ được tuần tự hóa, nếu nó được chuyển qua một số luồng, có hàm khởi tạo mặc định và cho phép truy cập vào các thuộc tính/trường bằng phương thức getter và setter.

Bạn có thể quan tâm đọc bài viết này: Discover the secrets of the Java Serialization API

+1

Nhưng tôi vẫn gặp vấn đề ngay cả khi tôi triển khai giao diện Serializable; class Person triển khai Serializable { \t tên chuỗi riêng tư; \t người công khai (Tên chuỗi) { \t \t this.name = name; \t} \t chuỗi công khai getName() { \t \t tên trả lại; \t} \t public void setName (Tên chuỗi) { \t \t this.name = name; \t} } – NOrder

+0

@vienna: Bạn có ngoại lệ giống nhau hay bất kỳ trường hợp nào khác không? –

+0

có, tôi có ngoại lệ tương tự – NOrder

0

lớp người nên thực hiện giao diện java.io.Serializable.

class Person implements Serializable

0

định nghĩa lớp Person của bạn cần có implements Serializable để cho nó để được tuần tự, ví dụ .:

class Person implements Serializable { 
    //Rest here 
} 

Dưới đây là một số liên kết hữu ích về đối tượng serialization Java: Link, Link.

-1

Trước hết, bạn nên biết lý do tại sao bạn làm cho lớp có thể lập trình được? Bất cứ khi nào bạn muốn di chuyển obeject trên mạng vào một tệp, cơ sở dữ liệu, mạng, quy trình hoặc bất kỳ hệ thống nào khác. Trong thực hiện java đơn giản. Chỉ cần triển khai giao diện Serializable.

0

Dưới đây là ví dụ code để làm cho đối tượng nhân viên tuần tự:

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

Vấn đề ở đây không phải ở "thực hiện Serializable". Vấn đề là đối tượng không được chuyển đổi trong DBObject.

giải pháp có thể:

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

.... 

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

tôi đã cùng một ngoại lệ khi làm việc với MongoDB. Tôi đã cố gắng làm cho lớp có vấn đề serializable nhưng điều đó không khắc phục được vấn đề của tôi.

Sau đây là những gì phù hợp với tôi. Mở rộng lớp học thành con của BasicDBObject. Tất nhiên điều này chỉ hoạt động nếu vấn đề là do MongoDB gây ra.

extends BasicDBObject 

nguồn gốc

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

0

Bạn có thể đạt được điều này bằng cách sử dụng đoạn mã sau:

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

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

Bây giờ trong mã MongoDB, bạn có thể serialise một danh sách Person như sau

.... 
PersonList personList = new PersonList(); 
personList.person = new ArrayList<>(); 
// add persons to the list 
.... 
.... 
record.put("personsList", personList); 
.... 
// rest of your code 
Các vấn đề liên quan