我正试着为合同运行corda-bootcamp测试用例。我按照视频中给出的,但是当我试图运行合同测试-我得到错误。
java.io.NotSerializableException: data(net.corda.core.contracts.ContractState) -> Trying to build an object serializer for bootcamp.TokenState, but it is not constructible from its public properties, and so requires a custom serialiser.有人能帮忙吗,怎么解决这个问题?我发现了一个类似的问题-- here,但这不起作用。
下面是使用的Tokenstate,
package bootcamp;
import com.google.common.collect.ImmutableList;
import net.corda.core.contracts.BelongsToContract;
import net.corda.core.contracts.ContractState;
import net.corda.core.identity.AbstractParty;
import net.corda.core.identity.Party;
import java.util.ArrayList;
import java.util.List;
/* Our state, defining a shared fact on the ledger.
* See src/main/java/examples/ArtState.java for an example. */
@BelongsToContract(TokenContract.class)
public class TokenState implements ContractState {
private Party issuer;
private Party owner;
private int amount;
public TokenState(Party issuer, Party owner, int amount) {
this.issuer = issuer;
this.owner = owner;
this.amount = amount;
}
public Party getIssuer() {
return issuer;
}
public Party getOwner() {
return owner;
}
public int getAmount() {
return amount;
}
public List<AbstractParty> getParticipants() {
List<AbstractParty> participants = new ArrayList<>();
participants.add(issuer);
participants.add(owner);
return participants;
}
}抛出错误的测试用例,
private final TestIdentity alice = new TestIdentity(new CordaX500Name("Alice", "", "GB"));
private final TestIdentity bob = new TestIdentity(new CordaX500Name("Bob", "", "GB"));
private MockServices ledgerServices = new MockServices(new TestIdentity(new CordaX500Name("TestId", "", "GB")));
private TokenState tokenState = new TokenState(alice.getParty(), bob.getParty(), 1);
@Test
public void tokenContractRequiresZeroInputsInTheTransaction() {
transaction(ledgerServices, tx -> {
// Has an input, will fail.
tx.input(TokenContract.ID, tokenState);
tx.output(TokenContract.ID, tokenState);
tx.command(Arrays.asList(alice.getPublicKey(), bob.getPublicKey()), new TokenContract.Commands.Issue());
tx.fails();
return null;
});
transaction(ledgerServices, tx -> {
// Has no input, will verify.
tx.output(TokenContract.ID, tokenState);
tx.command(Arrays.asList(alice.getPublicKey(), bob.getPublicKey()), new TokenContract.Commands.Issue());
tx.verifies();
return null;
});
}发布于 2019-09-22 04:36:29
Corda使用自己的序列化框架,该框架要求Java编译器在生成字节码时保留参数名,以便以后能够正确地重新创建对象。
要使它与IntelliJ一起工作,请执行以下操作:
打开设置:
- Windows: File -> Settings
- osX/ Ubuntu: IntelliJ IDEA -> Preferences
中写入-parameters


https://stackoverflow.com/questions/58033294
复制相似问题