该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-01-12
Copyright 1999-2101 Alibaba Group.
你的2101还没改回来啊,哈哈。。。 |
|
返回顶楼 | |
发表时间:2011-01-12
luffyke 写道 Copyright 1999-2101 Alibaba Group.
你的2101还没改回来啊,哈哈。。。 这是故意的,Alibaba公司要活102年,所以是这么写,没错的! |
|
返回顶楼 | |
发表时间:2011-01-12
wenshao 写道 半夜睡不着 ...
想了一些处理循环引用的办法,其中一个超级简单。 第一种,流氓粗暴的办法: try { // ... } catch (StackOverflowError e) { throw new JSONException("maybe circular references", e); } 很流氓,但是很简单很有效,不会影响效率。 第二种,编写存放引用的类,如果发现引用重复,则做处理。这个类如下: public final class JSONSerializerContext { public static final int DEFAULT_TABLE_SIZE = 64; private final Entry[] buckets; private final int indexMask; public JSONSerializerContext() { this(DEFAULT_TABLE_SIZE); } public JSONSerializerContext(int tableSize) { this.indexMask = tableSize - 1; this.buckets = new Entry[tableSize]; } // 添加引用,如果存在则返回true,否则返回false public final boolean put(Object obj) { final int hash = System.identityHashCode(obj); final int bucket = hash & indexMask; for (Entry entry = buckets[bucket]; entry != null; entry = entry.next) { if (obj == entry.object) { return true; } } Entry entry = new Entry(obj, hash, buckets[bucket]); buckets[bucket] = entry; return false; } protected static final class Entry { public final int hashCode; public final Object object; public Entry next; public Entry(Object object, int hash, Entry next) { this.object = object; this.next = next; this.hashCode = hash; } } } 只需要JavaBean的序列化是调用put方法检测就可以了,应该对性能影响不大,具体数据等有空测试才能具体确定影响多大,但初步估计性能影响较小。 对于出现循环引用的情况,处理办法两种:抛异常或者忽略。如果是抛异常,还不如上面第一种方式有效,如果忽略,还不如这样写: import com.alibaba.fastjson.annotation.JSONField; public class Category { private Category parent; private List<Category> children = new ArrayList<Category>(); @JSONField(serialize=false) // 标识不需要序列化 public Category getParent() { return parent; } public void setParent(Category parent) { this.parent = parent; } public List<Category> getChildren() { return children; } public void setChildren(List<Category> children) { this.children = children; } } 我在网上搜索了一下,JSON.NET也是采用Annotation标识忽略的办法来解决循环引用的。 大家给些参考意见。 最好能支持一个“最多循环引用次数”,有可能简化某些编程 |
|
返回顶楼 | |
发表时间:2011-01-12
wenshao 写道 luffyke 写道 Copyright 1999-2101 Alibaba Group.
你的2101还没改回来啊,哈哈。。。 这是故意的,Alibaba公司要活102年,所以是这么写,没错的! 呵呵, |
|
返回顶楼 | |
发表时间:2011-01-12
最后修改:2011-01-12
由于循环引用检测的成本较高,所以决定采用流氓做法:
try { // ... } catch (StackOverflowError e) { throw new JSONException("maybe circular references", e); } 同时建议使用@Annotation来避免循环引用。 例如: import com.alibaba.fastjson.annotation.JSONField; public class Category { private Category parent; private List<Category> children = new ArrayList<Category>(); @JSONField(serialize=false) // 标识不需要序列化 public Category getParent() { return parent; } public void setParent(Category parent) { this.parent = parent; } public List<Category> getChildren() { return children; } public void setChildren(List<Category> children) { this.children = children; } } |
|
返回顶楼 | |
发表时间:2011-01-12
vb2005xu 写道 看你的代码 真是对我JAVA底子的 一次全新的学习 呜呜呜
这三流代码也值得你们 55555 啊, 我看写的不怎么的, 全是赶工惹的。 不过温少有一个东西的代码是教科书式的。 不过离开源还很早,才0.1版本。 |
|
返回顶楼 | |
发表时间:2011-01-12
sdh5724 写道 vb2005xu 写道 看你的代码 真是对我JAVA底子的 一次全新的学习 呜呜呜
这三流代码也值得你们 55555 啊, 我看写的不怎么的, 全是赶工惹的。 不过温少有一个东西的代码是教科书式的。 不过离开源还很早,才0.1版本。 可否指引一下。。。那段代码在哪里? |
|
返回顶楼 | |
发表时间:2011-01-12
luffyke 写道 sdh5724 写道 vb2005xu 写道 看你的代码 真是对我JAVA底子的 一次全新的学习 呜呜呜
这三流代码也值得你们 55555 啊, 我看写的不怎么的, 全是赶工惹的。 不过温少有一个东西的代码是教科书式的。 不过离开源还很早,才0.1版本。 可否指引一下。。。那段代码在哪里? sdh5724的评价太高了,那个东东目前还不会开源,短期内你要看代码,估计要得来阿里才行 |
|
返回顶楼 | |
发表时间:2011-01-13
sdh5724 写道 vb2005xu 写道 看你的代码 真是对我JAVA底子的 一次全新的学习 呜呜呜
这三流代码也值得你们 55555 啊, 我看写的不怎么的, 全是赶工惹的。 不过温少有一个东西的代码是教科书式的。 不过离开源还很早,才0.1版本。 sdh5724,能不能抽点时间,把wenshao的代码做一次分析,让我们这些菜鸟学习一下?也让我们有机会提高一下自己的水平,让我们明白一流代码是什么样的,明白为什么wenshao的代码只能是三流。对比wenshao的代码,我们都决定他的代码很不错了。 如果你时间不多,哪怕每次只拿一小个代码片段给我们分析一下也好。这种实实在在的“重构”学习,比什么理论都强。 |
|
返回顶楼 | |
发表时间:2011-01-14
支持lqixv。。。
|
|
返回顶楼 | |