我今天从Corda V2升级到Corda V3。 在V2上运行的程序将无法运行,请帮助我。 发生以下错误: -
[ERROR] 16:02:31,129 [qtp1715876585-27](ExampleApi.java:226) api.ExampleApi.myMethod - java.io.NotSerializableException: net.corda.core.contracts.TransactionState - > data(net.corda.core.contracts.ContractState) - >构造函数参数 - "参数_2和#34; - 没有引用"类com.example.state.MyState"的属性。 - > class com.example.state.MyState {} java.util.concurrent.ExecutionException: java.io.NotSerializableException: net.corda.core.contracts.TransactionState - > data(net.corda.core.contracts.ContractState) - >构造函数参数 - "参数_2和#34; - 没有引用"类com.example.state.MyState"的属性。 - > class com.example.state.MyState
它出现在以下来源中。
flowHandle = rpcOps.startTrackedFlowDynamic(Myflow.Initiator.class,
parameter1 ,parameter_2);
final SignedTransaction result = flowHandle
.getReturnValue()
.get();
public class MyState implements QueryableState,LinearState {
private final Party partyA;
private final Party partyB;
private final int parameter_2
private final UniqueIdentifier linearId;
public Party getPartyA() {
return partyA;
}
public Party getPartyB() {
return partyB;
}
public int getParameter_2() {
return parameter_2;
}
public MyState(Party partyA, Party partyB, int parameter_2) {
this.partyA = partyA;
this.partyB = partyB;
parameter_2 = parameter_2;
this.linearId = new UniqueIdentifier();
}
@Override
public Iterable<MappedSchema> supportedSchemas() {
return ImmutableList.of(new MySchemaV1());
}
@Override
public PersistentState generateMappedObject(MappedSchema schema) {
if (schema instanceof MySchemaV1){
return new MySchemaV1.PersistentAA(
this.pratyA.getName().toString(),
this.partyB.getName().toString(),
this.parameter_2,
this.linearId.getId()
);
}else{
throw new IllegalArgumentException("abnormal argument");
}
}
@Override
public List<AbstractParty> getParticipants() {
return Arrays.asList(this.partyA,this.partyB);
}
@Override
public String toString() {
return String.format(“%s(partyA=%s, partyB=%s, parameter2=%s, linearId=%s)",
getClass().getSimpleName(),this.partyA,this.partyB,this.parameter_2,this.linearId);
}
@NotNull
@Override
public UniqueIdentifier getLinearId() {
return this.linearId;
}
}
答案 0 :(得分:1)
您似乎无法使用下划线作为Corda V3中State的成员变量。
在上面的示例代码中,当我们将“参数2”更改为“参数2”时,异常停止显示。
答案 1 :(得分:1)
字段名称中的下划线没有限制。例如,以下状态定义有效:
public class IOUState implements ContractState {
private final Integer value_2;
public IOUState(Integer value_2) { this.value_2 = value_2; }
public Integer getValue_2() { return value_2; }
@Override public List<AbstractParty> getParticipants() {
return ImmutableList.of();
}
}
您的代码中的其他地方一定存在问题。