今日问题两则

问题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方法不能随便乱用,使用时必须要有对应的返回值才可。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值