论坛首页 Java企业应用论坛

Fastjson技术内幕

浏览 87022 次
该帖已经被评为精华帖
作者 正文
   发表时间:2011-08-11  
wenshao 写道
ilxlf 写道
Hi, wenshao

我看了一下SerializeWriter的代码,有个地方不太理解。如果有时间的话请帮我解答一下:

public SerializeWriter() {
    buf = bufLocal.get(); // new char[1024];
    if (buf == null) {
buf = new char[1024];
    } else {
bufLocal.set(null);
    }
}

我想问的是为什么在else分支里面要调用set(null)。这样岂不是又把buf赋值为null? 那再次调用的时候又要重新在调用 new char[1024]?

谢谢。


你看close方法:
public void close() {
    bufLocal.set(buf);
}


如果不做bufLocal.set(null),一个线程持有两个SerializeWriter时,会导致内容错乱。

Hi, wenshao

假如我在调用close()方法后,不需要在保留buf的数据,那我可不可以直接在close()方法里把count重置为0.然后在构造函数里面就可以把那个else分支里面的set(null)抹去?

谢谢。
0 请登录后投票
   发表时间:2011-08-11  
回复ilxlf:

可以的。我很好奇的问一下,你要干嘛?
0 请登录后投票
   发表时间:2011-08-11  
Hi, wenshao

我想借用一下你这个类的思想,然后自己实现一个。我想用一个包装好的buffer类去替换char[]。 我这个类的用完的时候会把buffer的内容清空一下。

我看你的那个else分支的时候当时有点晕,不知道为什么要这么做。

我还有些问题想和你沟通一下:什么应用场景下,一个线程会拥有两个SerializeWriter的实例?那这个时候每个实例里面count的值是各不一样的?是不是应该限制这样用? 应该一个SerializeWriter用完后close掉,如果重新在new一个SerializeWriter的话,我感觉那个char[]不用清空,因为这个时候那个count是0开始的。不知道我的理解对不对。

请wenshao指点一下。
谢谢
0 请登录后投票
   发表时间:2011-08-11  
ilxlf 写道
Hi, wenshao

我想借用一下你这个类的思想,然后自己实现一个。我想用一个包装好的buffer类去替换char[]。 我这个类的用完的时候会把buffer的内容清空一下。

我看你的那个else分支的时候当时有点晕,不知道为什么要这么做。

我还有些问题想和你沟通一下:什么应用场景下,一个线程会拥有两个SerializeWriter的实例?那这个时候每个实例里面count的值是各不一样的?是不是应该限制这样用? 应该一个SerializeWriter用完后close掉,如果重新在new一个SerializeWriter的话,我感觉那个char[]不用清空,因为这个时候那个count是0开始的。不知道我的理解对不对。

请wenshao指点一下。
谢谢


如果存在自定义的序列化,这时候就可能一个线程创建了多个SerializeWriter对象,从而导致其中的内容buf错乱。这个设计是因为遇到过这样的bug才做的。
0 请登录后投票
   发表时间:2011-08-11   最后修改:2011-08-11
问个问题

在web项目中和spring集成的时候这样写
Java代码 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
    <property name="messageConverters">  
        <list>  
            <bean class="**.FashtJsonHttpMessageConverter" />  
        </list>  
    </property>  
</bean>  


事实是是不会起作用的

查看spring代码发现AnnotationDrivenBeanDefinitionParser类中这样写

Java代码 
private static final boolean jacksonPresent =  
        ClassUtils.isPresent("org.codehaus.jackson.map.ObjectMapper", AnnotationDrivenBeanDefinitionParser.class.getClassLoader()) &&  
                ClassUtils.isPresent("org.codehaus.jackson.JsonGenerator", AnnotationDrivenBeanDefinitionParser.class.getClassLoader());  



而后
Java代码 
if (jacksonPresent) {  
    messageConverters.add(createConverterBeanDefinition(MappingJacksonHttpMessageConverter.class, source));  
}  


并set到由AnnotationDrivenBeanDefinitionParser创建的AnnotationMethodHandlerAdapter类中

而如果在spring-mvc配置AnnotationMethodHandlerAdapter类的话,会创建另外AnnotationMethodHandlerAdapter实例(并不会被webmvc上下文引用,游离在系统中)。



难道真的要改写spring代码才能解决这个问题?



备注:我用的spring3.05
0 请登录后投票
   发表时间:2011-08-11  
试用了一下,真的非常不错,顶一个。
0 请登录后投票
   发表时间:2011-08-16  
还没有太多的试用和口碑,就技术内幕了,也太快了。还是先等口碑出来再说把
0 请登录后投票
   发表时间:2011-08-17   最后修改:2011-08-17
忘记说了,转换的时候带中文可能会出现乱码(只是小部分字符显示的是乱码)

这部分在编辑器下面显示的是nul

在记事本上面是其他形式

很明显不是源对象的乱码而是生成的时候加上去的部分导致乱码

我怀疑是不是操作byte的时候导致的问题
0 请登录后投票
   发表时间:2011-09-05   最后修改:2011-09-05
温少,解析数组形如:
[,[[832186,,,'1.545',,,,,,0,,],[,,,1]],[1,[[8595637,,],[1,[3,,'0.90','0.92','1.50'], [2,1]]]]]


逗号前的空白怎么不是用null来占位呢,而是直接pass掉了。这样解析不能真正还原数据的格式啊,json-lib采用的JSONNull来占位的
0 请登录后投票
   发表时间:2011-09-06  
...
这是一个468bytes的JSON Bytes测试,从测试结果来看...
...

想知道大数据处理比较的情况,如几百M。。。
据我所知protobuf大数据序列化挺慢的
谢谢~
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics