--- title: Java åºåå详解 description: æ·±å ¥è§£æJavaåºååä¸ååºååæºå¶ï¼è¯¦è§£Serializableæ¥å£ãtransientå ³é®åãserialVersionUIDä½ç¨ãåºåååè®®éæ©åRPCãç¼åçåºç¨åºæ¯ã category: Java tag: - Javaåºç¡ head: - - meta - name: keywords content: Javaåºåå,ååºåå,Serializableæ¥å£,transientå ³é®å,serialVersionUID,åºåååè®®,对象æä¹ å --- ## ä»ä¹æ¯åºåååååºåå? 妿æä»¬éè¦æä¹ å Java 对象æ¯å¦å° Java 对象ä¿å卿件ä¸ï¼æè å¨ç½ç»ä¼ è¾ Java 对象ï¼è¿äºåºæ¯é½éè¦ç¨å°åºååã ç®åæ¥è¯´ï¼ - **åºåå**ï¼å°æ°æ®ç»ææå¯¹è±¡è½¬æ¢æå¯ä»¥åå¨æä¼ è¾çå½¢å¼ï¼é常æ¯äºè¿å¶åèæµï¼ä¹å¯ä»¥æ¯ JSON, XML çææ¬æ ¼å¼ - **ååºåå**ï¼å°å¨åºååè¿ç¨ä¸æçæçæ°æ®è½¬æ¢ä¸ºåå§æ°æ®ç»ææè 对象çè¿ç¨ å¯¹äº Java è¿ç§é¢å对象ç¼ç¨è¯è¨æ¥è¯´ï¼æä»¬åºååç齿¯å¯¹è±¡ï¼Objectï¼ä¹å°±æ¯å®ä¾ååçç±»(Class)ï¼ä½æ¯å¨ C++è¿ç§åé¢å对象çè¯è¨ä¸ï¼struct(ç»æä½)å®ä¹çæ¯æ°æ®ç»æç±»åï¼è class 对åºçæ¯å¯¹è±¡ç±»åã ä¸é¢æ¯åºåååååºåå常è§åºç¨åºæ¯ï¼ - 对象å¨è¿è¡ç½ç»ä¼ è¾ï¼æ¯å¦è¿ç¨æ¹æ³è°ç¨ RPC çæ¶åï¼ä¹åéè¦å 被åºååï¼æ¥æ¶å°åºååç对象ä¹åéè¦åè¿è¡ååºååï¼ - å°å¯¹è±¡åå¨å°æä»¶ä¹åéè¦è¿è¡åºååï¼å°å¯¹è±¡ä»æä»¶ä¸è¯»ååºæ¥éè¦è¿è¡ååºååï¼ - å°å¯¹è±¡åå¨å°æ°æ®åºï¼å¦ Redisï¼ä¹åéè¦ç¨å°åºååï¼å°å¯¹è±¡ä»ç¼åæ°æ®åºä¸è¯»ååºæ¥éè¦ååºååï¼ - å°å¯¹è±¡åå¨å°å åä¹åéè¦è¿è¡åºååï¼ä»å åä¸è¯»ååºæ¥ä¹åéè¦è¿è¡ååºååã ç»´åºç¾ç§æ¯å¦æ¯ä»ç»åºååçï¼ > **åºåå**ï¼serializationï¼å¨è®¡ç®æºç§å¦çæ°æ®å¤çä¸ï¼æ¯æå°æ°æ®ç»ææå¯¹è±¡ç¶æè½¬æ¢æå¯åç¨æ ¼å¼ï¼ä¾å¦åææä»¶ï¼åäºç¼å²ï¼æç»ç±ç½ç»ä¸åéï¼ï¼ä»¥çå¾ åç»å¨ç¸åæå¦ä¸å°è®¡ç®æºç¯å¢ä¸ï¼è½æ¢å¤åå ç¶æçè¿ç¨ãä¾ç §åºååæ ¼å¼éæ°è·ååèçç»ææ¶ï¼å¯ä»¥å©ç¨å®æ¥äº§çä¸åå§å¯¹è±¡ç¸åè¯ä¹ç坿¬ã对äºè®¸å¤å¯¹è±¡ï¼åæ¯ä½¿ç¨å¤§éå¼ç¨çå¤æå¯¹è±¡ï¼è¿ç§åºååé建çè¿ç¨å¹¶ä¸å®¹æãé¢å对象ä¸ç对象åºååï¼å¹¶ä¸æ¦æ¬ä¹ååå§å¯¹è±¡æå ³ç³»ç彿°ãè¿ç§è¿ç¨ä¹ç§°ä¸ºå¯¹è±¡ç¼ç»ï¼marshallingï¼ãä»ä¸ç³»ååèæåæ°æ®ç»æçååæä½ï¼æ¯ååºååï¼ä¹ç§°ä¸ºè§£ç¼ç»ãdeserializationãunmarshallingï¼ã 综ä¸ï¼**åºååç主è¦ç®çæ¯éè¿ç½ç»ä¼ è¾å¯¹è±¡æè 说æ¯å°å¯¹è±¡åå¨å°æä»¶ç³»ç»ãæ°æ®åºãå åä¸ã** 
https://www.corejavaguru.com/java/serialization/interview-questions-1
**åºååå议对åºäº TCP/IP 4 屿¨¡åçåªä¸å±ï¼** æä»¬ç¥éç½ç»éä¿¡çåæ¹å¿ é¡»è¦éç¨åéµå®ç¸åçåè®®ãTCP/IP å屿¨¡åæ¯ä¸é¢è¿æ ·çï¼åºåååè®®å±äºåªä¸å±å¢ï¼ 1. åºç¨å± 2. ä¼ è¾å± 3. ç½ç»å± 4. ç½ç»æ¥å£å±  å¦ä¸å¾æç¤ºï¼OSI ä¸å±å议模åä¸ï¼è¡¨ç¤ºå±åçäºæ 主è¦å°±æ¯å¯¹åºç¨å±çç¨æ·æ°æ®è¿è¡å¤ç转æ¢ä¸ºäºè¿å¶æµãåè¿æ¥çè¯ï¼å°±æ¯å°äºè¿å¶æµè½¬æ¢æåºç¨å±çç¨æ·æ°æ®ãè¿ä¸å°±å¯¹åºçæ¯åºåååååºååä¹ï¼ å 为ï¼OSI ä¸å±å议模åä¸çåºç¨å±ã表示å±åä¼è¯å±å¯¹åºç齿¯ TCP/IP å屿¨¡åä¸çåºç¨å±ï¼æä»¥åºåååè®®å±äº TCP/IP åè®®åºç¨å±çä¸é¨åã ## 常è§åºåååè®®æåªäºï¼ JDK èªå¸¦çåºååæ¹å¼ä¸è¬ä¸ä¼ç¨ ï¼å 为åºååæçä½å¹¶ä¸åå¨å®å ¨é®é¢ãæ¯è¾å¸¸ç¨çåºåååè®®æ HessianãKryoãProtobufãProtoStuffï¼è¿äºé½æ¯åºäºäºè¿å¶çåºåååè®®ã å JSON å XML è¿ç§å±äºææ¬ç±»åºååæ¹å¼ãè½ç¶å¯è¯»æ§æ¯è¾å¥½ï¼ä½æ¯æ§è½è¾å·®ï¼ä¸è¬ä¸ä¼éæ©ã ### JDK èªå¸¦çåºååæ¹å¼ JDK èªå¸¦çåºååï¼åªéå®ç° `java.io.Serializable`æ¥å£å³å¯ã ```java @AllArgsConstructor @NoArgsConstructor @Getter @Builder @ToString public class RpcRequest implements Serializable { private static final long serialVersionUID = 1905122041950251207L; private String requestId; private String interfaceName; private String methodName; private Object[] parameters; private Class>[] paramTypes; private RpcMessageTypeEnum rpcMessageTypeEnum; } ``` **serialVersionUID æä»ä¹ä½ç¨ï¼** åºååå· `serialVersionUID` å±äºçæ¬æ§å¶çä½ç¨ãååºååæ¶ï¼ä¼æ£æ¥ `serialVersionUID` æ¯å¦åå½åç±»ç `serialVersionUID` ä¸è´ã妿 `serialVersionUID` ä¸ä¸è´åä¼æåº `InvalidClassException` å¼å¸¸ãå¼ºçæ¨èæ¯ä¸ªåºååç±»é½æå¨æå®å ¶ `serialVersionUID`ï¼å¦æä¸æå¨æå®ï¼é£ä¹ç¼è¯å¨ä¼å¨æçæé»è®¤ç `serialVersionUID`ã **serialVersionUID 䏿¯è¢« static åé修饰äºåï¼ä¸ºä»ä¹è¿ä¼è¢«âåºååâï¼** ~~`static` 修饰çå鿝éæåéï¼ä½äºæ¹æ³åºï¼æ¬èº«æ¯ä¸ä¼è¢«åºååçã `static` å鿝å±äºç±»çè䏿¯å¯¹è±¡ãä½ ååºåä¹åï¼`static` åéçå¼å°±åæ¯é»è®¤èµäºç»äºå¯¹è±¡ä¸æ ·ï¼çç就忝 `static` åé被åºååï¼å®é åªæ¯å象罢äºã~~ **ð ä¿®æ£ï¼åè§ï¼[issue#2174](https://github.com/Snailclimb/JavaGuide/issues/2174)ï¼**ï¼ é常æ åµä¸ï¼`static` å鿝å±äºç±»çï¼ä¸å±äºä»»ä½å个对象å®ä¾ï¼æä»¥å®ä»¬æ¬èº«ä¸ä¼è¢«å å«å¨å¯¹è±¡åºååçæ°æ®æµéãåºååä¿åçæ¯å¯¹è±¡çç¶æï¼ä¹å°±æ¯å®ä¾åéçå¼ï¼ãç¶èï¼`serialVersionUID` æ¯ä¸ä¸ªç¹ä¾ï¼`serialVersionUID` çåºåååäºç¹æ®å¤çãå ³é®å¨äºï¼`serialVersionUID` 䏿¯ä½ä¸ºå¯¹è±¡ç¶æçä¸é¨å被åºååçï¼èæ¯è¢«åºååæºå¶æ¬èº«ç¨ä½ä¸ä¸ªç¹æ®çâæçº¹âæâçæ¬å·âã å½ä¸ä¸ªå¯¹è±¡è¢«åºååæ¶ï¼`serialVersionUID` ä¼è¢«åå ¥å°åºååçäºè¿å¶æµä¸ï¼åæ¯å¨ä¿åä¸ä¸ªçæ¬å·ï¼è䏿¯ä¿å `static` åéæ¬èº«çç¶æï¼ï¼å¨ååºååæ¶ï¼ä¹ä¼è§£æå®å¹¶åä¸è´æ§å¤æï¼ä»¥æ¤æ¥éªè¯åºåå对象ççæ¬ä¸è´æ§ã妿䏤è ä¸å¹é ï¼ååºååè¿ç¨å°æåº `InvalidClassException`ï¼å 为è¿é常æå³çåºååçç±»çå®ä¹å·²ç»åçäºæ´æ¹ï¼å¯è½ä¸åå ¼å®¹ã 宿¹è¯´æå¦ä¸ï¼ > A serializable class can declare its own serialVersionUID explicitly by declaring a field named `"serialVersionUID"` that must be `static`, `final`, and of type `long`; > > å¦ææ³æ¾å¼æå® `serialVersionUID` ï¼åéè¦å¨ç±»ä¸ä½¿ç¨ `static` å `final` å ³é®åæ¥ä¿®é¥°ä¸ä¸ª `long` ç±»åçåéï¼åéååå¿ é¡»ä¸º `"serialVersionUID"` ã ä¹å°±æ¯è¯´ï¼`serialVersionUID` æ¬èº«ï¼ä½ä¸º static åéï¼ç¡®å®ä¸ä½ä¸ºå¯¹è±¡ç¶æè¢«åºååã使¯ï¼å®çå¼è¢« Java åºååæºå¶ç¹æ®å¤çäºââä½ä¸ºä¸ä¸ªçæ¬æ è¯ç¬¦è¢«è¯»åå¹¶åå ¥åºååæµä¸ï¼ç¨äºå¨ååºååæ¶è¿è¡çæ¬å ¼å®¹æ§æ£æ¥ã **妿æäºåæ®µä¸æ³è¿è¡åºååæä¹åï¼** 对äºä¸æ³è¿è¡åºååçåéï¼å¯ä»¥ä½¿ç¨ `transient` å ³é®å修饰ã `transient` å ³é®åçä½ç¨æ¯ï¼é»æ¢å®ä¾ä¸é£äºç¨æ¤å ³é®å修饰çåéåºååï¼å½å¯¹è±¡è¢«ååºååæ¶ï¼è¢« `transient` 修饰çåéå¼ä¸ä¼è¢«æä¹ å忢å¤ã å ³äº `transient` è¿æå ç¹æ³¨æï¼ - `transient` åªè½ä¿®é¥°åéï¼ä¸è½ä¿®é¥°ç±»åæ¹æ³ã - `transient` 修饰çåéï¼å¨ååºååååéå¼å°ä¼è¢«ç½®æç±»åçé»è®¤å¼ãä¾å¦ï¼å¦ææ¯ä¿®é¥° `int` ç±»åï¼é£ä¹ååºååç»æå°±æ¯ `0`ã - `static` åéå 为ä¸å±äºä»»ä½å¯¹è±¡(Object)ï¼æä»¥æ è®ºææ²¡æ `transient` å ³é®å修饰ï¼åä¸ä¼è¢«åºååã **为ä»ä¹ä¸æ¨èä½¿ç¨ JDK èªå¸¦çåºååï¼** æä»¬å¾å°æè 说å ä¹ä¸ä¼ç´æ¥ä½¿ç¨ JDK èªå¸¦çåºååæ¹å¼ï¼ä¸»è¦åå æä¸é¢è¿äºåå ï¼ - **䏿¯æè·¨è¯è¨è°ç¨** : 妿è°ç¨çæ¯å ¶ä»è¯è¨å¼åçæå¡çæ¶å就䏿¯æäºã - **æ§è½å·®**ï¼ç¸æ¯äºå ¶ä»åºååæ¡æ¶æ§è½æ´ä½ï¼ä¸»è¦åå æ¯åºååä¹åçåèæ°ç»ä½ç§¯è¾å¤§ï¼å¯¼è´ä¼ è¾ææ¬å 大ã - **åå¨å®å ¨é®é¢**ï¼åºåååååºååæ¬èº«å¹¶ä¸åå¨é®é¢ãä½å½è¾å ¥çååºååçæ°æ®å¯è¢«ç¨æ·æ§å¶ï¼é£ä¹æ»å»è å³å¯éè¿æé æ¶æè¾å ¥ï¼è®©ååºåå产çé颿ç对象ï¼å¨æ¤è¿ç¨ä¸æ§è¡æé çä»»æä»£ç ãç¸å ³é 读ï¼[åºç¨å®å ¨:JAVA ååºååæ¼æ´ä¹æ® - Cryin](https://cryin.github.io/blog/secure-development-java-deserialization-vulnerability/)ã[Java ååºååå®å ¨æ¼æ´æä¹åäº? - Monica](https://www.zhihu.com/question/37562657/answer/1916596031)ã ### Kryo Kryo æ¯ä¸ä¸ªé«æ§è½çåºåå/ååºååå·¥å ·ï¼ç±äºå ¶åé¿åå¨ç¹æ§å¹¶ä½¿ç¨äºåèç çææºå¶ï¼æ¥æè¾é«çè¿è¡é度åè¾å°çåèç ä½ç§¯ã å¦å¤ï¼Kryo å·²ç»æ¯ä¸ç§é常æççåºååå®ç°äºï¼å·²ç»å¨ TwitterãGrouponãYahoo 以åå¤ä¸ªèå弿ºé¡¹ç®ï¼å¦ HiveãStormï¼ä¸å¹¿æ³ç使ç¨ã [guide-rpc-framework](https://github.com/Snailclimb/guide-rpc-framework) å°±æ¯ä½¿ç¨ç kryo è¿è¡åºååï¼åºåååååºååç¸å ³ç代ç å¦ä¸ï¼ ```java /** * Kryo serialization class, Kryo serialization efficiency is very high, but only compatible with Java language * * @author shuang.kou * @createTime 2020å¹´05æ13æ¥ 19:29:00 */ @Slf4j public class KryoSerializer implements Serializer { /** * Because Kryo is not thread safe. So, use ThreadLocal to store Kryo objects */ private final ThreadLocal