การจัดลำดับประเภททั่วไปโดยใช้ Jackson

ฉันได้เขียนซีเรียลไลเซอร์ของตัวเองโดยใช้แจ็คสัน ใช้ตัวแปรหรือคลาสและส่งกลับค่าประเภทธรรมดาใดๆ

ตัวอย่าง: serialize(new MyClass(2.0)) จะส่งกลับ double ด้วยค่า 2.0 โดยที่ MyClass มีลักษณะดังนี้:

public class MyClass {
  private double number;

  public MyClass(double number) {
    this.number = number;
  }

  @JsonValue
  public double getNumber() {
    return number;
  }
}

ดังนั้นเพื่อให้ได้ค่าที่ถูกต้อง ฉันต้องตั้งค่า @JsonValue อย่างไรก็ตาม เมื่อฉันซีเรียลไลซ์อ็อบเจ็กต์ เช่น UUID ซึ่งไม่มีคำอธิบายประกอบ @JsonValue ก็จะส่งคืนสตริง UUID ที่คาดหวัง

การสร้างคลาสของฉันเองไม่มีคำอธิบายประกอบ @JsonValue ไม่มีผลเช่นเดียวกัน ในกรณีนี้ ทำให้เป็นอนุกรม(new MayClass(2.0)) ส่งคืนแผนที่ {"number":2.0} โดยที่ MyClass มีลักษณะดังนี้:

public class MyClass implements Serializable, Comparable<MyClass> {
  private double number;

  public MyClass(double number) {
    this.number = number;
  }

  public double getNumber() {
    return number;
  }

  @Override
  public int compareTo(MyClass obj) { return 0; }
}

คำถามของฉันคือเหตุใด UUID (และคลาสที่ทำให้ซีเรียลไลซ์ที่กำหนดไว้ล่วงหน้าอื่น ๆ ) ทำให้ซีเรียลไลซ์ตามที่คาดไว้ แต่คลาสที่ทำให้ซีเรียลไลซ์ของฉันเองกลับไม่ทำ นอกจากนี้ ฉันจะทำให้คลาสที่ทำให้ซีเรียลไลซ์ได้เป็นซีเรียลไลซ์อย่างถูกต้องได้อย่างไร


person Lyndsay    schedule 16.02.2016    source แหล่งที่มา
comment
ฉันคิดว่าคำถามของคุณได้รับคำตอบแล้วที่นี่: stackoverflow.com/questions/13432761/   -  person Christiaan Janssen    schedule 16.02.2016
comment
วิธีแก้ปัญหานั้นยังคงต้องใช้คำอธิบายประกอบ โดยเฉพาะในกรณีนั้น @JsonSerialize คลาสเช่น UUID และ URI (สิ่งเหล่านี้เป็นเพียงคลาสที่ฉันใช้ แต่ใช้ได้กับคลาส Serializable และ Comparable ทั้งหมด) ทำให้เป็นอนุกรมกับ String ที่ถูกต้อง (แทนที่จะเป็นแผนที่) โดยไม่มีการใช้คำอธิบายประกอบที่เกี่ยวข้องกับ Json อย่างแน่นอน นี่คือพฤติกรรมที่ฉันต้องทำซ้ำ   -  person Lyndsay    schedule 17.02.2016


คำตอบ (1)


แจ็กสันได้กำหนด UUID, URI, Date ฯลฯ ไว้ล่วงหน้าแล้ว ซีเรียลไลเซอร์และดีซีเรียลไลเซอร์ ดังนั้นจึงไม่จำเป็นต้องใส่คำอธิบายประกอบ

หากคุณต้องการทำให้ชั้นเรียนเป็นอนุกรมโดยไม่มีคำอธิบายประกอบ คุณจะต้องเขียนซีเรียลไลเซอร์และดีเซอริไลเซอร์แบบกำหนดเอง เช่น MyClassSerializer.

person Lyndsay    schedule 17.02.2016