2016-05-31 3 views
0

Я использовал ReflectionToStringBuilder для сериализации объекта для ведения журнала. Но у нас возникла проблема, когда он не печатает полные объекты. Как и в случае следующего случайСериализация объектов Java для ведения журнала

GetTimeBlocksOutput tbout = new GetTimeBlocksOutput(); 
TimeBlock tb = new TimeBlock(); 
tb.setAvailable(true); 
List<TimeBlock> tbList = new ArrayList<TimeBlock>(); 
tbList.add(tb); 
tbout.setTimeBlocks(tbList); 
System.out.println(ReflectionToStringBuilder.toString(tbout)); 

Он печатает

[email protected][timeBlocks [[email protected]]] 

Есть ли простой способ иметь сериализованный объект для входа цели? в основном что-то из коробки без необходимости ручного изменения объекта для печати

Json serializers являются одним из вариантов, но

  • они должны быть использованы для таких случаев?
  • Учитывая, что сериализация Json может вызывать исключение. Является ли их простой библиотекой, которая дает простой метод использования для достижения этой задачи?
+0

В чем причина переопределения .toString() непрактична? – Compass

+0

@Compass не может рассказать без каких-либо подробностей из OP, но вполне возможно, что у них нет возможности модифицировать рассматриваемый класс. – avojak

+0

@avojak, если это проблема, тогда я думаю, что вспомогательный метод, который запускает всю публику, попадает в String, будет более жизнеспособным вариантом. Использование отражения для выхода из закрытого класса - это бандайда. – Compass

ответ

2

Что вы видите, это реализация по умолчанию toString().

От Object.java

public String toString() { 
    return getClass().getName() + "@" + Integer.toHexString(hashCode()); 
} 

Просто переопределить этот метод и возвращает String представление, которое соответствует вашим потребностям!

GetTimeBlocksOutput может быть

public String toString() { 
    return this.timeBlocks.toString(); // assuming timeBlocks can't be null 
} 

TimeBlock может быть

public String toString() { 
    return "Available:" + this.available; 
} 

Вы не разделяют много об информации, содержащейся в TimeBlock и GetTimeBlocksOutput, но я уверен, что вы можете прийти с хорошим реализация.

+0

Это путь, если вы контролируете реализацию класса. Но что делать, если класс не может быть изменен, поскольку он исходит из библиотеки. –

+0

@SameerChaudhary Вы можете просто создать «TimeBlockUtils», который будет содержать статический метод toString (GetTimeBlocksOutput), в котором вы бы сделали что-то очень похожее. Здесь нет необходимости использовать отражение. – GuiSim

+0

Пожалуйста, обратитесь к моему отзыву здесь http: // stackoverflow.ком/вопросы/37555791/Java-объект-сериализация-за каротаж # comment63107108_37555791 –

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