2016-06-09 3 views
3

Я должен клонировать объект несколько раз. Мой объект не сериализуем. Я пользуюсь следующей функцией:Объект Java Clone с использованием GSON

@SuppressWarnings("unchecked") 
public static T cloneThroughJson(T t) { 
    Gson gson = new Gson(); 
    String json = gson.toJson(t); 
    return (T) gson.fromJson(json, t.getClass()); 
} 
// ... 
Object cloned = cloneThroughJson(someObject); 

Я обнаружил, что это возвращает каждую ссылку на один и тот же объект. например

Скажем, я первый называть его cloneThroughJson(x) возвращает Y я снова называть его в одной и той же функции cloneThroughJson(x). И снова возвращается Y.

Вы знаете, как клонировать несериализуемый объект в java, используя глубокое клонирование?

+0

Можете ли вы предоставить [mcve]? Откуда вы знаете, что возвращает тот же экземпляр? –

ответ

1

Похоже, что это известная проблема. Ваш метод будет ТОЛЬКО работать, если скопированный объект имеет конструктор без аргументов по умолчанию. Чтобы достичь желаемого - вам нужно создать создателя экземпляра.

От documentation:

В то время как десериализации объекта, Gson необходимо создать экземпляр по умолчанию класса выдрессированных классов, которые предназначены для сериализации и десериализации должен иметь конструктор без аргументов Не имеет значения, является ли общедоступным или приватным Как правило, создатели экземпляров необходимы, когда вы имеете дело с классом библиотеки, который НЕ определяет конструктор без аргументов

Экземпляр Creato г Пример

private class MoneyInstanceCreator implements InstanceCreator<Money> { 
    public Money createInstance(Type type) { 
    return new Money("1000000", CurrencyCode.USD); 
    } 
} 

тип может быть из соответствующего универсального типа

  • Очень полезно для вызова конструкторов, которые нуждаются в конкретной информации
  • общего типа К примеру, если в магазинах класса Id класса, для которого Идентификатор создается.
+0

В моем классе нет конструктора аргументов. –

Смежные вопросы