--- title: Java åºåå详解 category: Java tag: - Javaåºç¡ --- ## åºåååååºååç¸å ³æ¦å¿µ ### ä»ä¹æ¯åºåå?ä»ä¹æ¯ååºåå? 妿æä»¬éè¦æä¹ å Java 对象æ¯å¦å° Java 对象ä¿å卿件ä¸ï¼æè å¨ç½ç»ä¼ è¾ Java 对象ï¼è¿äºåºæ¯é½éè¦ç¨å°åºååã ç®åæ¥è¯´ï¼ - **åºåå**ï¼ å°æ°æ®ç»ææå¯¹è±¡è½¬æ¢æäºè¿å¶åèæµçè¿ç¨ - **ååºåå**ï¼å°å¨åºååè¿ç¨ä¸æçæçäºè¿å¶åèæµçè¿ç¨è½¬æ¢ææ°æ®ç»ææè 对象çè¿ç¨ å¯¹äº Java è¿ç§é¢å对象ç¼ç¨è¯è¨æ¥è¯´ï¼æä»¬åºååç齿¯å¯¹è±¡ï¼Objectï¼ä¹å°±æ¯å®ä¾ååçç±»(Class)ï¼ä½æ¯å¨ C++è¿ç§åé¢å对象çè¯è¨ä¸ï¼struct(ç»æä½)å®ä¹çæ¯æ°æ®ç»æç±»åï¼è class 对åºçæ¯å¯¹è±¡ç±»åã ç»´åºç¾ç§æ¯å¦æ¯ä»ç»åºååçï¼ > **åºåå**ï¼serializationï¼å¨è®¡ç®æºç§å¦çæ°æ®å¤çä¸ï¼æ¯æå°æ°æ®ç»ææå¯¹è±¡ç¶æè½¬æ¢æå¯åç¨æ ¼å¼ï¼ä¾å¦åææä»¶ï¼åäºç¼å²ï¼æç»ç±ç½ç»ä¸åéï¼ï¼ä»¥çå¾ åç»å¨ç¸åæå¦ä¸å°è®¡ç®æºç¯å¢ä¸ï¼è½æ¢å¤åå ç¶æçè¿ç¨ãä¾ç §åºååæ ¼å¼éæ°è·ååèçç»ææ¶ï¼å¯ä»¥å©ç¨å®æ¥äº§çä¸åå§å¯¹è±¡ç¸åè¯ä¹ç坿¬ã对äºè®¸å¤å¯¹è±¡ï¼åæ¯ä½¿ç¨å¤§éå¼ç¨çå¤æå¯¹è±¡ï¼è¿ç§åºååé建çè¿ç¨å¹¶ä¸å®¹æãé¢å对象ä¸ç对象åºååï¼å¹¶ä¸æ¦æ¬ä¹ååå§å¯¹è±¡æå ³ç³»ç彿°ãè¿ç§è¿ç¨ä¹ç§°ä¸ºå¯¹è±¡ç¼ç»ï¼marshallingï¼ãä»ä¸ç³»ååèæåæ°æ®ç»æçååæä½ï¼æ¯ååºååï¼ä¹ç§°ä¸ºè§£ç¼ç»ãdeserializationãunmarshallingï¼ã 综ä¸ï¼**åºååç主è¦ç®çæ¯éè¿ç½ç»ä¼ è¾å¯¹è±¡æè 说æ¯å°å¯¹è±¡åå¨å°æä»¶ç³»ç»ãæ°æ®åºãå åä¸ã** 
https://www.corejavaguru.com/java/serialization/interview-questions-1
### å®é å¼å䏿åªäºç¨å°åºåååååºååçåºæ¯ï¼ 1. 对象å¨è¿è¡ç½ç»ä¼ è¾ï¼æ¯å¦è¿ç¨æ¹æ³è°ç¨ RPC çæ¶åï¼ä¹åéè¦å 被åºååï¼æ¥æ¶å°åºååç对象ä¹åéè¦åè¿è¡ååºååï¼ 2. å°å¯¹è±¡åå¨å°æä»¶ä¸çæ¶åéè¦è¿è¡åºååï¼å°å¯¹è±¡ä»æä»¶ä¸è¯»ååºæ¥éè¦è¿è¡ååºååã 3. å°å¯¹è±¡åå¨å°ç¼åæ°æ®åºï¼å¦ Redisï¼æ¶éè¦ç¨å°åºååï¼å°å¯¹è±¡ä»ç¼åæ°æ®åºä¸è¯»ååºæ¥éè¦ååºååã ### åºååå议对åºäº TCP/IP 4 屿¨¡åçåªä¸å±ï¼ æä»¬ç¥éç½ç»éä¿¡çåæ¹å¿ é¡»è¦éç¨åéµå®ç¸åçåè®®ãTCP/IP å屿¨¡åæ¯ä¸é¢è¿æ ·çï¼åºåååè®®å±äºåªä¸å±å¢ï¼ 1. åºç¨å± 2. ä¼ è¾å± 3. ç½ç»å± 4. ç½ç»æ¥å£å±  å¦ä¸å¾æç¤ºï¼OSI ä¸å±å议模åä¸ï¼è¡¨ç¤ºå±åçäºæ 主è¦å°±æ¯å¯¹åºç¨å±çç¨æ·æ°æ®è¿è¡å¤ç转æ¢ä¸ºäºè¿å¶æµãåè¿æ¥çè¯ï¼å°±æ¯å°äºè¿å¶æµè½¬æ¢æåºç¨å±çç¨æ·æ°æ®ãè¿ä¸å°±å¯¹åºçæ¯åºåååååºååä¹ï¼ å 为ï¼OSI ä¸å±å议模åä¸çåºç¨å±ã表示å±åä¼è¯å±å¯¹åºç齿¯ TCP/IP å屿¨¡åä¸çåºç¨å±ï¼æä»¥åºåååè®®å±äº TCP/IP åè®®åºç¨å±çä¸é¨åã ## 常è§åºåååè®®å¯¹æ¯ JDK èªå¸¦çåºååæ¹å¼ä¸è¬ä¸ä¼ç¨ ï¼å 为åºååæçä½å¹¶ä¸é¨åçæ¬æå®å ¨æ¼æ´ãæ¯è¾å¸¸ç¨çåºåååè®®æ hessianãkyroãprotostuffã ä¸é¢æå°ç齿¯åºäºäºè¿å¶çåºåååè®®ï¼å JSON å XML è¿ç§å±äºææ¬ç±»åºååæ¹å¼ãè½ç¶ 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`ï¼å¦æä¸æå¨æå®ï¼é£ä¹ç¼è¯å¨ä¼å¨æçæé»è®¤çåºååå· æä»¬å¾å°æè 说å ä¹ä¸ä¼ç´æ¥ä½¿ç¨è¿ä¸ªåºååæ¹å¼ï¼ä¸»è¦åå æä¸¤ä¸ªï¼ 1. **䏿¯æè·¨è¯è¨è°ç¨** : 妿è°ç¨çæ¯å ¶ä»è¯è¨å¼åçæå¡çæ¶å就䏿¯æäºã 2. **æ§è½å·®** ï¼ç¸æ¯äºå ¶ä»åºååæ¡æ¶æ§è½æ´ä½ï¼ä¸»è¦åå æ¯åºååä¹åçåèæ°ç»ä½ç§¯è¾å¤§ï¼å¯¼è´ä¼ è¾ææ¬å 大ã ### Kryo Kryo æ¯ä¸ä¸ªé«æ§è½çåºåå/ååºååå·¥å ·ï¼ç±äºå ¶åé¿åå¨ç¹æ§å¹¶ä½¿ç¨äºåèç çææºå¶ï¼æ¥æè¾é«çè¿è¡é度åè¾å°çåèç ä½ç§¯ã å¦å¤ï¼Kryo å·²ç»æ¯ä¸ç§é常æççåºååå®ç°äºï¼å·²ç»å¨ TwitterãGrouponãYahoo 以åå¤ä¸ªèå弿ºé¡¹ç®ï¼å¦ HiveãStormï¼ä¸å¹¿æ³ç使ç¨ã [guide-rpc-framework](https://github.com/Snailclimb/guide-rpc-framework) å°±æ¯ä½¿ç¨ç kyro è¿è¡åºååï¼åºåååååºååç¸å ³ç代ç å¦ä¸ï¼ ```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