лучший подход для маршалинга демаршалинга неизменяемых объектов с помощью шаблона компоновщика - PullRequest
8 голосов
/ 14 июня 2011

У меня есть простой, спокойный сервис, который я разрабатываю в Java.Я искал несколько вариантов маршаллинга / демаршаллинга json.Возможные подходы, Джексб Джексон и т. Д., Являются для меня совершенно новыми, и я пытаюсь с ними справиться.Мне было интересно, смогу ли я получить какой-нибудь совет о том, какой подход и технологии лучше всего использовать, особенно если учесть, что многие объекты, которые меня интересуют, реализованы как неизменяемые, и я использовал шаблон компоновщика.Так что нет сеттеров, а конструктор является приватным.

Я смотрел на этот предыдущий вопрос: Шаблон Джексона + Строителя? размещен на stackoverflow.Я рассматриваю что-то подобное этому подходу, хотя было бы здорово получить несколько указателей на дополнительные ресурсы об использовании @ JsonDeserialize

Вот очень простой пример типа объекта, который я рассматриваю

public class Reading {

private final double xCoord;
private final double yCoord;
private final double diameter;
private final double reliability;
private final String qualityCode;


private Reading(Builder builder){
    xCoord = builder.xCoord;
    yCoord = builder.yCoord;
    diameter = builder.diameter;
    reliability = builder.reliability;
    qualityCode = builder.qualityCode;
}


public static class Builder {
    //required parameters
    private final double diameter;
    //optional parameters
    private double xCoord = 0.0;
    private double yCoord = 0.0;
    private double reliability = 1.0;
    private String qualityCode;


    public Builder (double diameter){
        this.diameter = diameter;
    }

    public Builder reliability(double val){
        reliability = val;
        return this;
    }

    public Builder qualityCode(String qualityCode){
        this.qualityCode = qualityCode;
        return this;
    }

    public Builder coordinates(double xCoord, double yCoord){
        this.xCoord = xCoord;
        this.yCoord = yCoord;
        return this;
    }

    public Reading build(){
        return new Reading(this);
    }

}

public double getXCoord() {return xCoord;}

public double getYCoord() {return yCoord;}

public String getQualityCode() {return qualityCode;}

public double getDiameter() { return diameter;}

public double getReliability() {return reliability; }

}

Нет проблем с маршалингом этого объекта, но демаршаллинг не кажется прямым.Также есть поддержка пропуска записей для значений объекта, которые являются нулевыми?

Ответы [ 5 ]

6 голосов
/ 14 июня 2011

вы можете сделать это: (реализовать только геттеры и использовать XmlAccessType.FIELD)

@XmlAccessorType(XmlAccessType.FIELD)
public class CreditCardVO implements Serializable {

  private Long ccNumber;
  private String ccName;


  public CreditCardVO(Long ccNumber, String ccName) {
   this.ccNumber = ccNumber;
   this.ccName = ccName;
  }


  private CreditCardVO() {
     // for JAXB's Magic
  }

  public Long getCcNumber() {
    return ccNumber;
  }

  public String getCcName() {
   return ccName;
  }    
}

взято из http://aniketshaligram.blogspot.com/2010/05/jaxb-immutable-objects.html

2 голосов
/ 14 июня 2011

Вы можете использовать XmlAdapter с JAXB для обработки неизменяемых объектов:

0 голосов
/ 14 июня 2011

Для чего это стоит, есть планы (но не готовый код) поддерживать стиль Builder для десериализации (согласно этой записи Jira ). Всякий раз, когда это будет реализовано, зависит от количества людей, работающих над проблемой (или, по крайней мере, выражающих интерес).

0 голосов
/ 14 июня 2011

Если вам нужно немного маршалинга / демаршиллинга, вы можете использовать JAXB, когда вы хотите вывод XML, в противном случае для JSON я предпочту добавить несколько фасадов, которые преобразуют строку JSON в объекты.каждый поток будет иметь свой собственный экземпляр Facade, так что не будет никакого смысла в неизменности, и если вы стремитесь сделать синглтон Facade, то также не будет никаких проблем.

При использовании JSON вы можете написатьсобственная логика для создания объекта, означает, что вы можете использовать конструктор или сеттеры.Помимо вышесказанного, затем с помощью Facade вы также сможете поддерживать подклассы и все под одним фасадом.

0 голосов
/ 14 июня 2011

Для простоты: не ходи туда. Джерси / Джексон должен сериализовать / десериализовать только значимые объекты, и нет никаких оснований делать их неизменяемыми, поскольку к ним нет (не должно быть) общего доступа.

т.е. каждый вызов службы должен генерировать новый объект значения, который не доступен другим потокам. Таким образом, вам не нужно беспокоиться об неизменности, и, следовательно, вы можете использовать стандартный способ получения и установки.

Не усложняй жизнь, если она ничего тебе не купит!


Возвращаясь намного позже, я не согласен с этим. Сегодня я в основном использую библиотеку Immutables для генерации объектов-значений, и она поставляется с хорошей поддержкой стандартной сериализации JSON .

...