Java 高效分组解码
我正在为SNMP协议开发一个Netty应用程序。该协议有3个不同的版本1、2、3和相应的消息格式。我想知道什么是最有效的方式来解码这些基于包格式之间的变化 Snmpv1消息格式: Snmpv2消息格式: 正如您所看到的,消息的格式不同。我会发布v3,它有很多不同,但我不能发布超过2个链接 我最初的想法是制作一个基于反射的decocder,但事实证明这相当麻烦 从github上的一个源代码中可以看出: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&
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已经编写好了。当速率决定步骤是网络时,解码效率不是主要考虑的问题。我不想使用已经建成的库,这是出于教育目的。