Java 高效分组解码

Java 高效分组解码,java,network-programming,protocols,netty,snmp,Java,Network Programming,Protocols,Netty,Snmp,我正在为SNMP协议开发一个Netty应用程序。该协议有3个不同的版本1、2、3和相应的消息格式。我想知道什么是最有效的方式来解码这些基于包格式之间的变化 Snmpv1消息格式: Snmpv2消息格式: 正如您所看到的,消息的格式不同。我会发布v3,它有很多不同,但我不能发布超过2个链接 我最初的想法是制作一个基于反射的decocder,但事实证明这相当麻烦 从github上的一个源代码中可以看出: public <T> T decode(W buf, Class<T&

我正在为SNMP协议开发一个Netty应用程序。该协议有3个不同的版本1、2、3和相应的消息格式。我想知道什么是最有效的方式来解码这些基于包格式之间的变化

Snmpv1消息格式:

Snmpv2消息格式:

正如您所看到的,消息的格式不同。我会发布v3,它有很多不同,但我不能发布超过2个链接

我最初的想法是制作一个基于反射的decocder,但事实证明这相当麻烦

从github上的一个源代码中可以看出:

    public <T> T decode(W buf, Class<T> clazz) throws Asn1Exception {
    if (typeEncoders.containsKey(clazz)) {
        return clazz.cast(typeEncoders.get(clazz).decode(buf));
    }

    T obj;
    @SuppressWarnings("unchecked")
    Map<String, Object> sequence = (Map<String, Object>)annotatedTypeEncoders.get(UniversalType.SEQUENCE).decode(buf);
    try {
        obj = clazz.newInstance();
        for (Map.Entry<String, Object> entry : sequence.entrySet()) {
            entry.getKey();
            Field field = clazz.getField(entry.getKey());
            field.setAccessible(true);
            field.set(obj, entry.getValue());
        }
    }
    catch (Exception e) {
        throw new Asn1Exception("Unable to set fields on object", e);
    }

    return obj;
}
使用类似以下内容的映射类my source:

public final class DefaultSnmpPdu implements SnmpCommonPdu {
@Asn1Type(type = Asn1Tag.INTEGER)
private SnmpMessageType type;
@Asn1Type(type = Asn1Tag.INTEGER)
private int requestId;
@Asn1Type(type = Asn1Tag.INTEGER)
private SnmpErrorType errorType;
@Asn1Type(type = Asn1Tag.INTEGER)
private int errorIndex;
@Asn1Type(type = Asn1Tag.SEQUENCE)
private Map<String, Object> variableBindings;

@Override
public SnmpMessageType getType() {
    return type;
}

@Override
public int getRequestId() {
    return requestId;
}

@Override
public SnmpErrorType getErrorType() {
    return errorType;
}

@Override
public int getErrorIndex() {
    return errorIndex;
}

@Override
public Map<String, Object> getVariableBindings() {
    return Collections.unmodifiableMap(variableBindings);
}
}

我对所有想法都持开放态度,谢谢。

呃,为什么?SNMP4J已经编写好了。当速率决定步骤是网络时,解码效率不是主要考虑的问题。我不想使用已经建成的库,这是出于教育目的。