AppBlock appBlock = service.appGetBlockByNumber(DefaultBlockParameter.valueOf(number), true).send();
当获取 appBlock.getBlock().getBody().getTransactions(),由于transactions中只返回hash、content、from这三个字段,所以导致直接序列化整个对象的时候,或者单独取blockNumber的时候就会报以下错误
cita-sdk-java 解析返回值出错
你说的“直接序列化整个对象”是指序列化哪个对象?
方便贴一下相关的代码吗?
appBlock.getBlock().getBody().getTransactions() ,transaction对象中获取除了hash、content、from这三个字段外的其他字段,都会报错
@xiao8 appBlock.getBlock().getBody().getTransactions() 获取的是交易数组,如果想获取hash、content、from字段的话,要指定是交易数组的哪一笔交易
参见
https://github.com/citahub/cita-sdk-java/blob/23866215e1fbad74e5c7c9b78506e1e9abb2819b/core/src/main/java/com/citahub/cita/protocol/rx/JsonRpc2_0Rx.java#L270
getTransactions返回的是AppBlock.TransactionObject,要调用get方法转成Transaction,然后才能访问里面的成员。
public BigInteger getBlockNumber() {
return Numeric.decodeQuantity(blockNumber);
}
public String getBlockNumberRaw() {
return blockNumber;
}
Transaction结构里的blockNumber是String类型,只是在getBlockNumber方法里面做了一个String到BigInterger的转换。
你可以调用下面那个方法,直接把String类型的值打印出来看一下是怎么回事。
我知道原因了。
getBlockByNumber带上with transaction参数,rpc接口返回的其实是序列化之后的交易结构。
SDK里做了反序列化,并解析成SDK里的Transaction结构。但是这种情况下,是没有blockNumber和blockHash两个字段的,两者都是空字符串。
getTransactionByHash这个rpc接口,返回的结果也是一个交易结构,但是里面是带blockNumber和blockHash两个字段的。
是两个不同的rpc接口返回同样的内容,但是返回的信息有差异,sdk把他们解析到了同一个结构体,导致前面那种情况有两个字段是空的。