0

私は Protostuff を使用してデータの読み取り/書き込みを行うチームの一員です。これは、mergeFromクラスから拡張されたクラスのメソッドですSchema

@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");
            }
        }
    }

私の現在のタスクは、そのデータのスキーマが既に削除されているデータの読み取りをスキップすることです。インターフェイスのhandleUnknownFieldメソッドを見ていInputます。

これをすでに経験した人はいますか?

4

1 に答える 1

1

解決策は確かに非常に基本的です。この参照を見てください:スキーマ、および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()));

        }
...

ありがとう、この QA が他の人に役立つことを願っています!

于 2012-07-23T04:04:12.580 に答える