论坛首页 Java企业应用论坛

吹牛:我写的JSONParser可能是这个星球上最快了(Java)

浏览 143271 次
该帖已经被评为精华帖
作者 正文
   发表时间:2011-01-12  
Copyright 1999-2101 Alibaba Group.

你的2101还没改回来啊,哈哈。。。
0 请登录后投票
   发表时间:2011-01-12  
luffyke 写道
Copyright 1999-2101 Alibaba Group.

你的2101还没改回来啊,哈哈。。。


这是故意的,Alibaba公司要活102年,所以是这么写,没错的!
0 请登录后投票
   发表时间: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标识忽略的办法来解决循环引用的。

大家给些参考意见。



最好能支持一个“最多循环引用次数”,有可能简化某些编程
0 请登录后投票
   发表时间:2011-01-12  
wenshao 写道
luffyke 写道
Copyright 1999-2101 Alibaba Group.

你的2101还没改回来啊,哈哈。。。


这是故意的,Alibaba公司要活102年,所以是这么写,没错的!

呵呵,
0 请登录后投票
   发表时间: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;
	}
}
0 请登录后投票
   发表时间:2011-01-12  
vb2005xu 写道
看你的代码 真是对我JAVA底子的 一次全新的学习 呜呜呜



这三流代码也值得你们 55555 啊, 我看写的不怎么的, 全是赶工惹的。 不过温少有一个东西的代码是教科书式的。 不过离开源还很早,才0.1版本。
0 请登录后投票
   发表时间:2011-01-12  
sdh5724 写道
vb2005xu 写道
看你的代码 真是对我JAVA底子的 一次全新的学习 呜呜呜



这三流代码也值得你们 55555 啊, 我看写的不怎么的, 全是赶工惹的。 不过温少有一个东西的代码是教科书式的。 不过离开源还很早,才0.1版本。

可否指引一下。。。那段代码在哪里?
0 请登录后投票
   发表时间:2011-01-12  
luffyke 写道
sdh5724 写道
vb2005xu 写道
看你的代码 真是对我JAVA底子的 一次全新的学习 呜呜呜



这三流代码也值得你们 55555 啊, 我看写的不怎么的, 全是赶工惹的。 不过温少有一个东西的代码是教科书式的。 不过离开源还很早,才0.1版本。

可否指引一下。。。那段代码在哪里?


sdh5724的评价太高了,那个东东目前还不会开源,短期内你要看代码,估计要得来阿里才行 
0 请登录后投票
   发表时间:2011-01-13  
sdh5724 写道
vb2005xu 写道
看你的代码 真是对我JAVA底子的 一次全新的学习 呜呜呜



这三流代码也值得你们 55555 啊, 我看写的不怎么的, 全是赶工惹的。 不过温少有一个东西的代码是教科书式的。 不过离开源还很早,才0.1版本。


sdh5724,能不能抽点时间,把wenshao的代码做一次分析,让我们这些菜鸟学习一下?也让我们有机会提高一下自己的水平,让我们明白一流代码是什么样的,明白为什么wenshao的代码只能是三流。对比wenshao的代码,我们都决定他的代码很不错了。

如果你时间不多,哪怕每次只拿一小个代码片段给我们分析一下也好。这种实实在在的“重构”学习,比什么理论都强。
0 请登录后投票
   发表时间:2011-01-14  
支持lqixv。。。
0 请登录后投票
论坛首页 Java企业应用版

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