我是一个使用原型读/写数据的团队的一员。这是从Schema类扩展的类的mergeFrom方法:
@Override
public void mergeFrom(Input input, Entity entity) throws IOException {
for(int number = input.readFieldNumber(this); ; number = input.readFieldNumber(this))
{
if ( number == 0 ) {
break;
} else if ( number == FIELD_DEFINITION_ID ) {
Schema idmSchema = entity.getSchema();
// Definition id
int definitionId = input.readUInt32();
NodeDefinition defn = idmSchema.getById(definitionId);
if ( defn == null ) {
throw new ProtostuffException("Invalid definition id "+definitionId);
}
Node<?> node = defn.createNode();
entity.add(node);
// Node
readAndCheckFieldNumber(input, FIELD_NODE);
input.mergeObject(node, getSchema(node.getClass()));
} else if ( number == FIELD_CHILD_NODE_STATE ){
//Node state
int intState = input.readInt32();
State state = State.parseState(intState);
readAndCheckFieldNumber(input, FIELD_CHILD_DEFINITION_ID);
int childDefnId = input.readInt32();
Schema schema = entity.getSchema();
NodeDefinition childDefn = schema.getById(childDefnId);
entity.childStates.put(childDefn.getName(), state);
} else {
throw new ProtostuffException("Unexpected field number");
}
}
}我现在的任务是跳过读取数据,其中该数据的模式已经被删除。我正在研究Input接口的handleUnknownField方法。
有没有人已经体验过这种情况?
发布于 2012-07-23 12:04:13
这个解决方案确实非常基础。查看这个引用:Schema,并检查mergeFrom代码:
public void mergeFrom(Input input, User user) throws IOException
{
while(true)
{
int number = input.readFieldNumber(this);
switch(number)
{
case 0:
return;
case 1:
user.setEmail(input.readString());
break;
case 2:
user.setFirstName(input.readString());
break;
case 3:
user.setLastName(input.readString());
break;
case 4:
if(message.friends == null)
message.friends = new ArrayList<User>();
message.friends.add(input.mergeObject(null, this));
break;
default:
input.handleUnknownField(number, this);
}
}
}我想我应该直接用input.handleUnknownField(number, this);。它正确地解决了我的问题,如下所示:
...
} else if ( number == FIELD_DEFINITION_ID ) {
Schema idmSchema = entity.getSchema();
// Definition id
int definitionId = input.readUInt32();
NodeDefinition defn = idmSchema.getById(definitionId);
if ( defn == null ) {
input.handleUnknownField(number, this);
continue;
}
Node<?> node = defn.createNode();
entity.add(node);
// Node
readAndCheckFieldNumber(input, FIELD_NODE);
input.mergeObject(node, getSchema(node.getClass()));
}
...谢谢,希望这篇问答对其他人有好处!
https://stackoverflow.com/questions/11556599
复制相似问题