JAVA序列化中的一些问题

2014年6月3日 没有评论

1.serialVersionUID的作用

  serialVersionUID可以认为是一个类的摘要,默认值的计算依赖于类的构造方法、成员变量和成员方法的定义规则,具体算法代码位于:java.io.ObjectStreamClass.computeDefaultSUID(Class<?>) 。对于implements Serializable的类而言可以显示或非显示的定义serialVersionUID,在通常情况下建议显示定义serialVersionUID,这样就算改变成员方法定义也不会影响到反序列化操作。

2.成员变量的增加或减少会影响反序列化吗?

  这个问题的前提是显示定义了serialVersionUID,如果非显示定义serialVersionUID则对 构造方法、成员变量和成员方法的任意修改都会导致反序列化失败,因为反序列化时会计算当前Class的serialVersionUID,如果序列化前后不一致则会导致反序列化失败。

  在显示定义了serialVersionUID的情况下如果保证serialVersionUID的值序列化前后不变,则对成员变量的增加或减少都不会导致反序列化失败,但如果是对原有成员变量的定义进行了修改,如:public int a;变成了public Srting a; 则会导致反序列化失败,具体代码位于:java.io.ObjectStreamClass.matchFields(ObjectStreamField[], ObjectStreamClass) 方法,这个方法会判断序列化对象和jvm加载对象的属性类型是否一样。

分类: 高级民工 标签:

JQuery多个ready()方法执行顺序

2014年4月25日 没有评论

  JQuery.ready()方法传入一个function作为参数,一个页面中允许多个JQuery.ready()调用,在dom加载完毕后依照JQuery.ready()调用的先后顺序执行传入的function。

  如果想让某个JQuery.ready()里的function最后执行可以采用一个变通方法:

$(function(){
	$(function(){
		alert("last!")
	});
});

如果有其他代码里面使用了这种方式可以嵌套多个,这样就能达到最后执行的目的了。

分类: 高级民工 标签:

Oracle按天建立表分区

2013年11月26日 没有评论

创建语句如下:

CREATE TABLE t_log(
       id    NUMBER,
       log_name    VARCHAR(100)
       log_date DATE
)
partition BY range (log_date)
INTERVAL (NUMTODSINTERVAL(1,'day'))
(
         partition p1234 VALUES less than (to_date('2013-11-11','yyyy-mm-dd'))
);

查询表分区:

SELECT * FROM user_tab_partitions t WHERE t.TABLE_NAME = 'T_LOG' ORDER BY t.partition_name

删除表分区:

ALTER TABLE T_LOGDROP PARTITION SYS_P122

如果要为一个现存的表创建表分区,先创建一个表结构与之一样的新表,再把数据插入到新表中,最后重命名表名即可。(需要注意表重命名的时候表会有短暂的不可用,并且在一个操作频繁的表中进行这种操作也需要注意数据的完整性。)

分类: 高级民工 标签:

在BAE环境中让wordpress使用WP-SuperCache

2013年8月20日 没有评论

在BAE应用管理中心–>云环境–>托管管理–>版本管理–>找到发布的版本–高级–>配置中找到NFS。如果之前是开启状态首先关闭他,然后在wordpress后台启用WP-SuperCache。进入WP-SuperCache的配置页把cache打开,然后再打开NFS,并修改wp-config.php在添加一句:define(‘WP_CACHE’, true); 就可以在BAE中使用WP-SuperCache了,但由于目前BAE的NFS不是很稳定,可能会不成功。

分类: BLOG建设 标签:

Apache HttpClient无法解析错误头信息

2013年8月19日 没有评论

  在使用HttpClient 4.2时遇到服务器返回头信息错误的情况会导致一个异常发生。

Caused by: org.apache.http.ProtocolException: Invalid header: content-Type=text/html;charset=gbk
	at org.apache.http.impl.io.AbstractMessageParser.parseHeaders(AbstractMessageParser.java:226)
	at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:261)
	at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289)
	at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252)
	at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191)
	at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300)
	at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127)
	at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:712)
	at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:517)
	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)

出现异常的原因是org.apache.http.message.BufferedHeader类无法解析,所以如果想要忽略header信息的要嘛修改HttpClient的源码,要嘛通过继承来重写方法实现。HttpClient的官方文档中已有说明 http://hc.apache.org/httpcomponents-client-ga/tutorial/html/advanced.html
  但上面的方法对于使用PoolingClientConnectionManager的情况是不适用的。在使用PoolingClientConnectionManager时由于其实现内部用到了连接池org.apache.http.impl.conn.HttpConnPool,在其中有个static类用于返回DefaultClientConnection,代码如下:

    static class InternalConnFactory implements ConnFactory<HttpRoute, OperatedClientConnection> {
 
        public OperatedClientConnection create(final HttpRoute route) throws IOException {
            return new DefaultClientConnection();
        }
 
    }

所以结合HttpClient文档中的方法则需要在这里对return new DefaultClientConnection();这句代码进行修改就能达到目的。当然为了不修改其源码一个实现方式是自己创建一个包路径为org.apache.http.impl.conn,在这个包下创建继承于PoolingClientConnectionManager的类来最终达到忽略异常header的目的。

分类: 高级民工 标签: