问题1,关于netflow v9的一个问题:
v9中,该项 SysUptime 的 代表意义:
Time in milliseconds since this device was first booted,根据英文翻译,应当是设备的启动时间长度,已毫秒数计算。
该值定义长度为4个字节,最大表示2的32次方的值 ,为4294967296,大概40亿左右。但是一年的毫秒数 已经超过 24*3600*1000*365=31536000000,大概300亿左右。这样说来,设备启动超过一个月就超出了4个字节所能表示的范围。
这个问题协议中没有说明,不知真正的路由器是如何解决该问题的?
问题2:
jdk版本:1.7 ,jackson 版本1.9.11
在使用jacson时出现了以下问题
org.codehaus.jackson.map.JsonMappingException
: Failed to instantiate standard serializer (of type org.codehaus.jackson.map.ser.std.NullSerializer): Class org.codehaus.jackson.map.ser.BasicSerializerFactory can not access a member of class org.codehaus.jackson.map.ser.std.NullSerializer with modifiers "private" (through reference chain: ict.analyser.netflow.V9_Packet["normalFlows"]->java.util.ArrayList[0])
at org.codehaus.jackson.map.JsonMappingException.wrapWithPath(
JsonMappingException.java:218
)
at org.codehaus.jackson.map.JsonMappingException.wrapWithPath(
JsonMappingException.java:197
)
at org.codehaus.jackson.map.ser.std.SerializerBase.wrapAndThrow(
SerializerBase.java:166
)
at org.codehaus.jackson.map.ser.std.StdContainerSerializers$IndexedListSerializer.serializeContents(
StdContainerSerializers.java:127
)
at org.codehaus.jackson.map.ser.std.StdContainerSerializers$IndexedListSerializer.serializeContents(
StdContainerSerializers.java:71
)
at org.codehaus.jackson.map.ser.std.AsArraySerializerBase.serialize(
AsArraySerializerBase.java:86
)
at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(
BeanPropertyWriter.java:446
)
at org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(
BeanSerializerBase.java:150
)
at org.codehaus.jackson.map.ser.BeanSerializer.serialize(
BeanSerializer.java:112
)
at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(
StdSerializerProvider.java:610
)
at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(
StdSerializerProvider.java:256
)
at org.codehaus.jackson.map.ObjectMapper._configAndWriteValue(
ObjectMapper.java:2575
)
at org.codehaus.jackson.map.ObjectMapper.writeValueAsString(
ObjectMapper.java:2097
)
at com.meriit.netflow.out.JSONTranslater.toJson(
JSONTranslater.java:56
)
at com.meriit.netflow.pcap.example.ReadPcap.main(
ReadPcap.java:54
)
Caused by:
java.lang.IllegalStateException
: Failed to instantiate standard serializer (of type org.codehaus.jackson.map.ser.std.NullSerializer): Class org.codehaus.jackson.map.ser.BasicSerializerFactory can not access a member of class org.codehaus.jackson.map.ser.std.NullSerializer with modifiers "private"
at org.codehaus.jackson.map.ser.BasicSerializerFactory.findSerializerByLookup(
BasicSerializerFactory.java:250
)
at org.codehaus.jackson.map.ser.BeanSerializerFactory.createSerializer(
BeanSerializerFactory.java:283
)
at org.codehaus.jackson.map.ser.StdSerializerProvider._createUntypedSerializer(
StdSerializerProvider.java:782
)
at org.codehaus.jackson.map.ser.StdSerializerProvider._createAndCacheUntypedSerializer(
StdSerializerProvider.java:758
)
at org.codehaus.jackson.map.ser.StdSerializerProvider.findValueSerializer(
StdSerializerProvider.java:380
)
at org.codehaus.jackson.map.ser.std.BeanSerializerBase.resolve(
BeanSerializerBase.java:307
)
at org.codehaus.jackson.map.ser.impl.SerializerCache.addAndResolveNonTypedSerializer(
SerializerCache.java:159
)
at org.codehaus.jackson.map.ser.StdSerializerProvider._createAndCacheUntypedSerializer(
StdSerializerProvider.java:744
)
at org.codehaus.jackson.map.ser.StdSerializerProvider.findValueSerializer(
StdSerializerProvider.java:344
)
at org.codehaus.jackson.map.ser.impl.PropertySerializerMap.findAndAddSerializer(
PropertySerializerMap.java:39
)
at org.codehaus.jackson.map.ser.std.AsArraySerializerBase._findAndAddDynamic(
AsArraySerializerBase.java:165
)
at org.codehaus.jackson.map.ser.std.StdContainerSerializers$IndexedListSerializer.serializeContents(
StdContainerSerializers.java:118
)
... 11 more
Caused by:
java.lang.IllegalAccessException
: Class org.codehaus.jackson.map.ser.BasicSerializerFactory can not access a member of class org.codehaus.jackson.map.ser.std.NullSerializer with modifiers "private"
at sun.reflect.Reflection.ensureMemberAccess(
Reflection.java:109
)
at java.lang.Class.newInstance(
Class.java:368
)
at org.codehaus.jackson.map.ser.BasicSerializerFactory.findSerializerByLookup(
BasicSerializerFactory.java:248
)
... 22 more
|
分析很久发现是由于jacson没有加载我的类Netflow导致的。在正式代码前调用一次tojosn方法可解决该问题,例如:
V9_Packet v9pack =
new
V9_Packet();
ArrayList<Netflow> normalFlows =
new
ArrayList<Netflow>();
normalFlows.add(
new
Netflow());
v9pack.setNormalFlows(normalFlows);
String json;
try
{
json =
trans
.toJson(v9pack);
}
catch
(Exception e) {
e.printStackTrace();
}
......
|
使用以上虽然没有错误了,但是问题的根本原因并未找到。
最后发现实现类中有这么一个方法:
public void getDeatail(){
System.out.println(".....")
}
该方法返回void,导致jacson去初始化
org.codehaus.jackson.map.ser.std.NullSerializer 而该类的默认构造方法为private
所以调用 类的newInstance 方法就会导致以上异常。
所以get方法不能随便乱用,使用时必须要有对应的返回值才可。