用于日志记录的Java对象序列化

用于日志记录的Java对象序列化,java,json,serialization,Java,Json,Serialization,我一直在使用序列化对象来记录日志。但我们遇到了这样一个问题:它不能打印完整的对象。比如下面的例子 GetTimeBlocksOutput tbout = new GetTimeBlocksOutput(); TimeBlock tb = new TimeBlock(); tb.setAvailable(true); List<TimeBlock> tbList = new ArrayList<TimeBlock>(); tbList.add(tb); tbout.setT

我一直在使用序列化对象来记录日志。但我们遇到了这样一个问题:它不能打印完整的对象。比如下面的例子

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));
有没有一种简单的方法可以将序列化对象用于日志记录?主要是一些开箱即用的东西,不需要手动更改要打印的对象

是一种选择,但

  • 是否应将其用于此类情况
  • 考虑到Json序列化可能引发异常。它们是否是一个简单的库,提供了简单的util方法来完成任务
您看到的是默认的
toString()
实现

Object.java

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
只需重写此方法并返回符合您需要的
字符串
表示

GetTimeBlocksOutput可能是

public String toString() {
    return this.timeBlocks.toString(); // assuming timeBlocks can't be null
}
时间段可能是

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

关于TimeBlock和GetTimeBlocksOutput中包含的信息,您没有分享太多,但我相信您可以想出一个很好的实现。

为什么.toString()重写不实用?@Compass如果没有OP提供的更多详细信息,将无法判断,但是有可能他们没有能力修改所讨论的类。@avojak如果这是个问题,那么我认为一个运行所有公共进入字符串的helper方法将是一个更可行的选择。使用反射从一个封闭的类中注销是一个难题。@Compass我同意-而且不仅是一个难题,而且非常脆弱。我只是在处理一个简单地重写是不可行的场景:)很抱歉延迟响应。所讨论的类来自类似于库的输入/输出类,用于服务调用或实体bean类,用于在持久层编写助手方法中表示对象,将代码与下划线实体紧密耦合。如果有人向bean中添加了另一个属性,您的日志将不会有这个额外的字段。在生产中出现故障之前,您不会意识到丢失的信息,并且您想知道对象属性的值是什么。如果有其他可用的方法,那么我们不应该维护不必要的代码。如果您控制类的实现,那么这就是方法。但若类不能被修改,因为它来自库。@SameerChaudhary您可以简单地创建一个
TimeBlockUtils
,它将包含一个静态
toString(GetTimeBlocksOutput)
方法,您可以在该方法中执行类似的操作。这里没有必要使用反射。请参考我的回答
public String toString() {
    return "Available:" + this.available;
}