首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用protostuff,如何跳过读取删除的实体?

使用protostuff,如何跳过读取删除的实体?
EN

Stack Overflow用户
提问于 2012-07-19 16:13:52
回答 1查看 291关注 0票数 0

我是一个使用原型读/写数据的团队的一员。这是从Schema类扩展的类的mergeFrom方法:

代码语言:javascript
复制
@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方法。

有没有人已经体验过这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-23 12:04:13

这个解决方案确实非常基础。查看这个引用:Schema,并检查mergeFrom代码:

代码语言:javascript
复制
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);。它正确地解决了我的问题,如下所示:

代码语言:javascript
复制
...
} 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()));

        }
...

谢谢,希望这篇问答对其他人有好处!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11556599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档