找回密码
 立即注册
首页 业界区 业界 一站式消息管理器

一站式消息管理器

阎逼 2025-6-6 09:38:54
一站式的消息管理器

在网络应用中,消息处理是必不可少的,该文章主要简单介绍一款简单的消息管理器的实现,其具备以下功能:

  • 提供多种消息序列化和反序列化方式,目前支持JDK、ProtoStuff以及JSON,提供其他自定义的序列化/反序列化器插口。
  • 提供多种消息加密/解密,目前支持对称加密:AES、不对称加密:RSA、不可逆散列加密:MD5以及Base64的转化并且提供自定义的加密/解密器插口。
  • 提供简单方便的消息构造,支持链式构造。
  • 支持创建可复用的流程化消息发送器和接收器、可以完成从消息发布、消息格式化、消息序列化/反序列化,消息加密/解密的流程处理,并且发送器和接收器支持序列化保存。
首先需要引入依赖:
  1. <dependency>
  2.       <groupId>io.protostuff</groupId>
  3.       protostuff-core</artifactId>
  4.       <version>1.6.0</version>
  5. </dependency>
  6. <dependency>
  7.       <groupId>io.protostuff</groupId>
  8.       protostuff-runtime</artifactId>
  9.       <version>1.6.0</version>
  10. </dependency>
  11. <dependency>
  12.       <groupId>com.google.code.gson</groupId>
  13.       gson</artifactId>
  14.       <version>2.8.5</version>
  15. </dependency>
复制代码
然后直接拷贝源码
  1. import com.google.gson.*;
  2. import io.protostuff.LinkedBuffer;
  3. import io.protostuff.ProtostuffIOUtil;
  4. import io.protostuff.Schema;
  5. import io.protostuff.runtime.RuntimeSchema;
  6. import sun.misc.BASE64Decoder;
  7. import sun.misc.BASE64Encoder;
  8. import javax.crypto.Cipher;
  9. import javax.crypto.spec.SecretKeySpec;
  10. import java.io.*;
  11. import java.lang.reflect.Type;
  12. import java.math.BigInteger;
  13. import java.nio.charset.Charset;
  14. import java.nio.charset.StandardCharsets;
  15. import java.security.*;
  16. import java.security.spec.PKCS8EncodedKeySpec;
  17. import java.security.spec.X509EncodedKeySpec;
  18. import java.util.*;
  19. import java.util.concurrent.ConcurrentHashMap;
  20. /**
  21. * 提供一站式的消息处理
  22. *
  23. * @author JingGe(* ^ ▽ ^ *)
  24. * @date 2023-03-24 15:53
  25. * @email 1158055613@qq.com
  26. */
  27. public class MessageManager {
  28.     /*=================消息序列化/反序列化器=================>*/
  29.     private static final Gson GSON = new GsonBuilder()
  30.             .enableComplexMapKeySerialization()
  31.             .setDateFormat("yyyy-MM-dd HH:mm:ss")
  32.             .registerTypeAdapter(Class.class, new ClassCodec())
  33.             .create();
  34.     public static final MessageSerializer<String> JSON_SERIALIZER = GSON::toJson;
  35.     public static final MessageDeserializer<Object> JSON_DESERIALIZER = (source, type) -> GSON.fromJson(new String(source, StandardCharsets.UTF_8), type);
  36.     public static final MessageSerializer<byte[]> PROTO_STUFF_SERIALIZER = ProtoStuffUtil::serialize;
  37.     public static final MessageDeserializer<Object> PROTO_STUFF_DESERIALIZER = ProtoStuffUtil::deserialize;
  38.     public static final MessageSerializer<byte[]> JDK_SERIALIZER = source -> {
  39.         ByteArrayOutputStream stream = new ByteArrayOutputStream();
  40.         try {
  41.             ObjectOutputStream outputStream = new ObjectOutputStream(stream);
  42.             outputStream.writeObject(source);
  43.         } catch (IOException e) {
  44.             e.printStackTrace();
  45.         }
  46.         return stream.toByteArray();
  47.     };
  48.     public static final MessageDeserializer<Object> JDK_DESERIALIZER = (source, type) -> {
  49.         ByteArrayInputStream stream = new ByteArrayInputStream(source);
  50.         try {
  51.             ObjectInputStream inputStream = new ObjectInputStream(stream);
  52.             return (Serializable) inputStream.readObject();
  53.         } catch (IOException | ClassNotFoundException e) {
  54.             e.printStackTrace();
  55.         }
  56.         return null;
  57.     };
  58.     public interface MessageSerializer<T> {
  59.         T serialize(Object source);
  60.     }
  61.     public interface MessageDeserializer<T> {
  62.         T deserialize(byte[] source, Class<T> type);
  63.     }
  64.     /*=======================Finished======================<*/
  65.     /*=================加密/解密器=================>*/
  66.     public static final Encryptor<Object> NO_ENCRYPTOR = (source, key) -> source;
  67.     public static final Decipher<Object> NO_DECIPHER = (source, key) -> source;
  68.     public static final Encryptor<byte[]> AES_ENCRYPTOR = (source, key) -> {
  69.         try {
  70.             Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  71.             cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(bytes(key, Charset.defaultCharset(), "密钥只能是byte array或者String"), "AES"));
  72.             return cipher.doFinal(source);
  73.         } catch (Exception e) {
  74.             e.printStackTrace();
  75.         }
  76.         return null;
  77.     };
  78.     public static final Decipher<byte[]> AES_DECIPHER = (source, key) -> {
  79.         try {
  80.             Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  81.             cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(bytes(key, Charset.defaultCharset(), "密钥只能是byte array或者String"), "AES"));
  82.             return cipher.doFinal(source);
  83.         } catch (Exception e) {
  84.             e.printStackTrace();
  85.         }
  86.         return null;
  87.     };
  88.     public static final RSAEncryptor RSA_ENCRYPTOR = new RSAEncryptor();
  89.     public static final RSADecipher RSA_DECIPHER = new RSADecipher();
  90.     public static final MD5Encryptor MD5_ENCRYPTOR = new MD5Encryptor();
  91.     public static final Encryptor<String> BASE64_ENCRYPTOR = (source, key) -> {
  92.         BASE64Encoder encoder = new BASE64Encoder();
  93.         return encoder.encode(source);
  94.     };
  95.     public static final Decipher<byte[]> BASE64_DECIPHER = (source, key) -> {
  96.         try {
  97.             BASE64Decoder decoder = new BASE64Decoder();
  98.             return decoder.decodeBuffer(new String(source));
  99.         } catch (Exception e) {
  100.             e.printStackTrace();
  101.         }
  102.         return null;
  103.     };
  104.     public static class RSAEncryptor implements Encryptor<byte[]> {
  105.         @Override
  106.         public byte[] encrypt(byte[] source, Object publicKey) {
  107.             try {
  108.                 PublicKey key = null;
  109.                 if (publicKey instanceof PublicKey) {
  110.                     key = (PublicKey) publicKey;
  111.                 } else {
  112.                     byte[] content = bytes(publicKey, Charset.defaultCharset(), "密钥格式异常:" + publicKey
  113.                             .getClass()
  114.                             .getName());
  115.                     X509EncodedKeySpec keySpec = new X509EncodedKeySpec(content);
  116.                     KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  117.                     key = keyFactory.generatePublic(keySpec);
  118.                     ;
  119.                 }
  120.                 Cipher cipher = Cipher.getInstance("RSA");
  121.                 cipher.init(Cipher.ENCRYPT_MODE, key);
  122.                 return cipher.doFinal(source);
  123.             } catch (Exception e) {
  124.                 e.printStackTrace();
  125.             }
  126.             return null;
  127.         }
  128.         public KeyPair generateKeyPair(int keySize) {
  129.             try {
  130.                 keySize = keySize <= 0 ? 2048 : keySize;
  131.                 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
  132.                 keyPairGenerator.initialize(keySize);
  133.                 return keyPairGenerator.generateKeyPair();
  134.             } catch (Exception e) {
  135.                 e.printStackTrace();
  136.             }
  137.             return null;
  138.         }
  139.     }
  140.     public static class RSADecipher implements Decipher<byte[]> {
  141.         @Override
  142.         public byte[] decrypt(byte[] source, Object privateKey) {
  143.             try {
  144.                 PrivateKey key = null;
  145.                 if (privateKey instanceof PrivateKey) {
  146.                     key = (PrivateKey) privateKey;
  147.                 } else {
  148.                     byte[] content = bytes(privateKey, Charset.defaultCharset(), "密钥格式异常:" + privateKey
  149.                             .getClass()
  150.                             .getName());
  151.                     PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(content);
  152.                     KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  153.                     key = keyFactory.generatePrivate(keySpec);
  154.                 }
  155.                 Cipher cipher = Cipher.getInstance("RSA");
  156.                 cipher.init(Cipher.DECRYPT_MODE, key);
  157.                 return cipher.doFinal(source);
  158.             } catch (Exception e) {
  159.                 e.printStackTrace();
  160.             }
  161.             return null;
  162.         }
  163.     }
  164.     public static class MD5Encryptor implements Encryptor<String> {
  165.         @Override
  166.         public String encrypt(byte[] source, Object saltKey) {
  167.             byte[] key = bytes(saltKey, Charset.defaultCharset(), "密钥只能是String或byte array");
  168.             byte[] content = new byte[source.length + key.length];
  169.             System.arraycopy(source, 0, content, 0, source.length);
  170.             System.arraycopy(key, 0, content, source.length, key.length);
  171.             byte[] res;
  172.             try {
  173.                 MessageDigest messageDigest = MessageDigest.getInstance("md5");
  174.                 res = messageDigest.digest(messageDigest.digest(content));
  175.                 if (res != null) {
  176.                     StringBuilder md5code = new StringBuilder(new BigInteger(1, res).toString(16));
  177.                     for (int i = 0; i < 32 - md5code.length(); i++) {
  178.                         md5code.insert(0, "0");
  179.                     }
  180.                     return md5code.toString();
  181.                 }
  182.             } catch (NoSuchAlgorithmException e) {
  183.                 e.printStackTrace();
  184.             }
  185.             return null;
  186.         }
  187.     }
  188.     public interface Encryptor<T> {
  189.         T encrypt(byte[] source, Object key);
  190.     }
  191.     public interface Decipher<T> {
  192.         T decrypt(byte[] source, Object key);
  193.     }
  194.     /*=======================Finished======================<*/
  195.     /*=================消息格式化器=================>*/
  196.     public interface MessageFormatter<T> {
  197.         void format(T msg);
  198.     }
  199.     /*=======================Finished======================<*/
  200.     public static MessageBuilder newMessageBuilder() {
  201.         return new MessageBuilder();
  202.     }
  203.     public static <T> MessageSenderWrapper<T> newMessageSenderWrapper(MessageSender<T> sender) {
  204.         return new MessageSenderWrapper<>(sender);
  205.     }
  206.     public static <T> MessageReceiverWrapper<T> newMessageReceiverBuilder(MessageReceiver<T> receiver) {
  207.         return new MessageReceiverWrapper<>(receiver);
  208.     }
  209.     public static <R> R getMessage(Object msg, MessageSerializer<R> serializer) {
  210.         return serializer.serialize(msg);
  211.     }
  212.     public static <R> R encryptMessage(byte[] msg, byte[] key, Encryptor<R> encryptor) {
  213.         return encryptor.encrypt(msg, key);
  214.     }
  215.     public static <R> R decryptMessage(byte[] msg, byte[] key, Decipher<R> decipher) {
  216.         return decipher.decrypt(msg, key);
  217.     }
  218.     public static String convert2Base64(byte[] msg) {
  219.         return BASE64_ENCRYPTOR.encrypt(msg, null);
  220.     }
  221.     public static byte[] base642Bytes(String base64) {
  222.         return BASE64_DECIPHER.decrypt(base64.getBytes(), null);
  223.     }
  224.     @SuppressWarnings("unchecked")
  225.     public static <T> T fromMessage(byte[] msg, Class<T> type, MessageDeserializer<Object> deserializer) {
  226.         return (T) deserializer.deserialize(msg, (Class<Object>) type);
  227.     }
  228.     public static Map<String, Object> wrapper2Map(Code code, String message, Object data) {
  229.         Map<String, Object> msg = new HashMap<>();
  230.         msg.put("code", code.flag);
  231.         msg.put("message", message);
  232.         msg.put("data", data);
  233.         return msg;
  234.     }
  235.     public static String getJsonMessage(Code code, String message, Object data) {
  236.         return getMessage(wrapper2Map(code, message, data), JSON_SERIALIZER);
  237.     }
  238.     public static String getJsonMessage(Code code, String message) {
  239.         return getMessage(wrapper2Map(code, message, null), JSON_SERIALIZER);
  240.     }
  241.     public static byte[] getProtoStuffMessage(Code code, String message, Object data) {
  242.         return getMessage(wrapper2Map(code, message, data), PROTO_STUFF_SERIALIZER);
  243.     }
  244.     public static byte[] getProtoStuffMessage(Code code, String message) {
  245.         return getMessage(wrapper2Map(code, message, null), PROTO_STUFF_SERIALIZER);
  246.     }
  247.     public static byte[] getJDKMessage(Code code, String message, Object data) {
  248.         return getMessage(wrapper2Map(code, message, data), JDK_SERIALIZER);
  249.     }
  250.     public static byte[] getJDKMessage(Code code, String message) {
  251.         return getMessage(wrapper2Map(code, message, null), JDK_SERIALIZER);
  252.     }
  253.     public static class MessageBuilder {
  254.         private final Map<String, Object> container = new ConcurrentHashMap<>();
  255.         private MessageSerializer<?> serializer;
  256.         private MessageBuilder() {
  257.         }
  258.         public MessageBuilder addMsg(String title, Object content) {
  259.             container.put(title, content);
  260.             return this;
  261.         }
  262.         public MessageBuilder addAllMsg(Map<String, Object> msg) {
  263.             container.putAll(msg);
  264.             return this;
  265.         }
  266.         public MessageBuilder code(Code code) {
  267.             container.put("code", code.flag);
  268.             return this;
  269.         }
  270.         public MessageBuilder message(String message) {
  271.             container.put("message", message);
  272.             return this;
  273.         }
  274.         public MessageBuilder data(Object data) {
  275.             container.put("data", data);
  276.             return this;
  277.         }
  278.         public MessageBuilder setSerializer(MessageSerializer<?> serializer) {
  279.             this.serializer = serializer;
  280.             return this;
  281.         }
  282.         public void clear() {
  283.             container.clear();
  284.         }
  285.         @SuppressWarnings("unchecked")
  286.         public <T> T getFinalMessage() {
  287.             return (T) (serializer == null ? JSON_SERIALIZER : serializer).serialize(container);
  288.         }
  289.     }
  290.     public static class MessageSender<T> implements Serializable, MessageHandler<T> {
  291.         private final List<MessageFormatter<Object>> formatters = new ArrayList<>();
  292.         private MessageSerializer<?> serializer;
  293.         private Encryptor<?> encryptor;
  294.         private Object key;
  295.         private Charset charset;
  296.         private boolean encode2Base64WhenEncrypted;
  297.         public MessageSender() {
  298.         }
  299.         @Override
  300.         @SuppressWarnings("unchecked")
  301.         public T getFinalMessage(Object msg) {
  302.             if (msg == null) {
  303.                 return null;
  304.             }
  305.             for (MessageFormatter<Object> formatter : formatters) {
  306.                 if (formatter != null) {
  307.                     formatter.format(msg);
  308.                 }
  309.             }
  310.             Object ser = serializer == null ? msg : serializer.serialize(msg);
  311.             byte[] content = bytes(ser, charset, "序列化后的消息只能是String或者byte array");
  312.             if (encryptor != null) {
  313.                 if (encode2Base64WhenEncrypted) {
  314.                     return (T) convert2Base64(bytes(encryptor.encrypt(content, key), charset, "加密后的消息只能是String或者byte array"));
  315.                 }
  316.                 return (T) encryptor.encrypt(content, key);
  317.             }
  318.             return (T) ser;
  319.         }
  320.         @SuppressWarnings("unchecked")
  321.         public static <T> MessageSender<T> fromBytes(byte[] source, MessageDeserializer<Object> deserializer) {
  322.             return (MessageSender<T>) fromMessage(source, MessageSender.class, deserializer);
  323.         }
  324.     }
  325.     public static class MessageReceiver<T> implements Serializable, MessageHandler<T> {
  326.         private final List<MessageFormatter<Object>> formatters = new ArrayList<>();
  327.         private MessageDeserializer<Object> deserializer;
  328.         private Decipher<?> decipher;
  329.         private Class<T> type;
  330.         private Object key;
  331.         private Charset charset;
  332.         private boolean decode2Base64BeforeDecrypt;
  333.         public MessageReceiver() {
  334.         }
  335.         @Override
  336.         @SuppressWarnings("unchecked")
  337.         public T getFinalMessage(Object msg) {
  338.             byte[] content = null;
  339.             if (decode2Base64BeforeDecrypt) {
  340.                 if (msg instanceof String) {
  341.                     content = base642Bytes((String) msg);
  342.                 } else {
  343.                     throw new UnsupportedOperationException("消息不是String类型,无法进行Base64解码");
  344.                 }
  345.             }
  346.             Object des = content == null ? msg : content;
  347.             if (decipher != null) {
  348.                 des = decipher.decrypt(content == null ? bytes(msg, charset, "如果消息需要解密,则消息必须是byte array") : content, key);
  349.             }
  350.             T ser = (T) des;
  351.             if (deserializer != null) {
  352.                 ser = (T) deserializer.deserialize(bytes(des, charset, "解密后的结果必须是String或者byte array"), (Class<Object>) type);
  353.             }
  354.             for (MessageFormatter<Object> formatter : formatters) {
  355.                 if (formatter != null) {
  356.                     formatter.format(ser);
  357.                 }
  358.             }
  359.             return (T) ser;
  360.         }
  361.         @SuppressWarnings("unchecked")
  362.         public static <T> MessageReceiver<T> fromBytes(byte[] source, MessageDeserializer<Object> deserializer) {
  363.             return (MessageReceiver<T>) fromMessage(source, MessageReceiver.class, deserializer);
  364.         }
  365.     }
  366.     public interface MessageHandler<T> {
  367.         T getFinalMessage(Object msg);
  368.     }
  369.     private static byte[] bytes(Object src, Charset charset, String errorMsg) {
  370.         if (src instanceof byte[]) {
  371.             return (byte[]) src;
  372.         } else if (src instanceof String) {
  373.             return charset == null ? ((String) src).getBytes() : ((String) src).getBytes(charset);
  374.         }
  375.         throw new UnsupportedOperationException(errorMsg);
  376.     }
  377.     public static class MessageSenderWrapper<T> {
  378.         private final MessageSender<T> sender;
  379.         private MessageSenderWrapper(MessageSender<T> sender) {
  380.             this.sender = sender;
  381.         }
  382.         public MessageSenderWrapper<T> addFormatter(MessageFormatter<Object> formatter) {
  383.             sender.formatters.add(formatter);
  384.             return this;
  385.         }
  386.         public MessageSenderWrapper<T> setSerializer(MessageSerializer<?> serializer) {
  387.             sender.serializer = serializer;
  388.             return this;
  389.         }
  390.         public MessageSenderWrapper<T> setEncryptor(Encryptor<?> encryptor, Object key, Charset charset, boolean encode2Base64) {
  391.             if (encryptor == null || key == null) {
  392.                 throw new IllegalArgumentException("加密器和密钥不能为空");
  393.             }
  394.             sender.encryptor = encryptor;
  395.             sender.key = key;
  396.             sender.charset = charset;
  397.             sender.encode2Base64WhenEncrypted = encode2Base64;
  398.             return this;
  399.         }
  400.         public MessageSender<T> wrap() {
  401.             return sender;
  402.         }
  403.     }
  404.     public static class MessageReceiverWrapper<T> {
  405.         private final MessageReceiver<T> receiver;
  406.         public MessageReceiverWrapper(MessageReceiver<T> receiver) {
  407.             this.receiver = receiver;
  408.         }
  409.         public MessageReceiverWrapper<T> addFormatter(MessageFormatter<Object> formatter) {
  410.             receiver.formatters.add(formatter);
  411.             return this;
  412.         }
  413.         public MessageReceiverWrapper<T> setDeserializer(MessageDeserializer<Object> deserializer, Class<T> type) {
  414.             receiver.deserializer = deserializer;
  415.             receiver.type = type;
  416.             return this;
  417.         }
  418.         public MessageReceiverWrapper<T> setDecipher(Decipher<?> decipher, Object key, Charset charset, boolean decodeBase642ByteArray) {
  419.             if (decipher == null || key == null) {
  420.                 throw new IllegalArgumentException("解密器和密钥不能为空");
  421.             }
  422.             receiver.decipher = decipher;
  423.             receiver.key = key;
  424.             receiver.charset = charset;
  425.             receiver.decode2Base64BeforeDecrypt = decodeBase642ByteArray;
  426.             return this;
  427.         }
  428.         public MessageReceiver<T> wrap() {
  429.             return receiver;
  430.         }
  431.     }
  432.     /**
  433.      * 状态枚举,支持枚举标识修改
  434.      *
  435.      * @author Huang Yongxiang
  436.      * @date 2021/9/30 9:25
  437.      */
  438.     public enum Code {
  439.         /**
  440.          * 请求成功
  441.          */
  442.         OK("success", 200),
  443.         /**
  444.          * 服务器内部错误
  445.          */
  446.         ERROR("error", 500),
  447.         /**
  448.          * 客户端请求的语法错误,服务器无法理解
  449.          */
  450.         BAD_REQUEST("bad request", 400),
  451.         /**
  452.          * 服务器理解请求客户端的请求,但是拒绝执行此请求
  453.          */
  454.         FORBIDDEN("Forbidden", 403),
  455.         /**
  456.          * 超时
  457.          */
  458.         TIME_OUT("time out", 408),
  459.         /**
  460.          * 服务器无法根据客户端请求的内容特性完成请求
  461.          */
  462.         NOT_ACCEPTABLE("Not Acceptable", 406),
  463.         /**
  464.          * 服务器不支持请求的功能,无法完成请求
  465.          */
  466.         NOT_SUPPORT("Not Implemented", 501),
  467.         /**
  468.          * 已接受。已经接受请求,但未处理完成
  469.          */
  470.         ACCEPTED("Accepted", 202);
  471.         private String message;
  472.         private Integer flag;
  473.         Code(String message, Integer flag) {
  474.             this.message = message;
  475.             this.flag = flag;
  476.         }
  477.         public String getMessage() {
  478.             return message;
  479.         }
  480.         public Code setMessage(String message) {
  481.             this.message = message;
  482.             return this;
  483.         }
  484.         public Integer getFlag() {
  485.             return flag;
  486.         }
  487.         public Code setFlag(Integer flag) {
  488.             this.flag = flag;
  489.             return this;
  490.         }
  491.         @Override
  492.         public String toString() {
  493.             return "Code{" + "message='" + message + '\'' + ", flag=" + flag + '}';
  494.         }
  495.     }
  496.     private static class ClassCodec implements JsonSerializer<Class<?>>, JsonDeserializer<Class<?>> {
  497.         @Override
  498.         public Class<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
  499.             try {
  500.                 String str = json.getAsString();
  501.                 return Class.forName(str);
  502.             } catch (ClassNotFoundException e) {
  503.                 throw new JsonParseException(e);
  504.             }
  505.         }
  506.         @Override
  507.         public JsonElement serialize(Class<?> src, Type typeOfSrc, JsonSerializationContext context) {
  508.             return new JsonPrimitive(src.getName());
  509.         }
  510.     }
  511.     private static class ProtoStuffUtil {
  512.         private static final ThreadLocal<LinkedBuffer> threadSafeBuffer = new ThreadLocal<>();
  513.         private static final Map<Class<?>, Schema<?>> schemaMap = new ConcurrentHashMap<>();
  514.         @SuppressWarnings("unchecked")
  515.         public static <T> byte[] serialize(T source) {
  516.             if (source == null) {
  517.                 return null;
  518.             }
  519.             Class<T> clazz = (Class<T>) source.getClass();
  520.             Schema<T> schema = getSchema(clazz);
  521.             if (schema == null) {
  522.                 throw new NullPointerException("无法获取" + clazz + "的模式");
  523.             }
  524.             try {
  525.                 if (threadSafeBuffer.get() == null) {
  526.                     threadSafeBuffer.set(LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));
  527.                 }
  528.                 return ProtostuffIOUtil.toByteArray(source, schema, threadSafeBuffer.get());
  529.             } finally {
  530.                 threadSafeBuffer
  531.                         .get()
  532.                         .clear();
  533.             }
  534.         }
  535.         public static <T> T deserialize(byte[] data, Class<T> type) {
  536.             if (data == null || data.length == 0) {
  537.                 return null;
  538.             }
  539.             Schema<T> schema = getSchema(type);
  540.             if (schema == null) {
  541.                 throw new NullPointerException("无法获取" + type + "的模式");
  542.             }
  543.             T source = schema.newMessage();
  544.             ProtostuffIOUtil.mergeFrom(data, source, schema);
  545.             return source;
  546.         }
  547.         @SuppressWarnings("unchecked")
  548.         private static <T> Schema<T> getSchema(Class<T> clazz) {
  549.             Schema<T> schema = (Schema<T>) schemaMap.get(clazz);
  550.             if (schema == null) {
  551.                 schema = RuntimeSchema.getSchema(clazz);
  552.                 schemaMap.put(clazz, schema);
  553.             }
  554.             return schema;
  555.         }
  556.     }
复制代码
可以增加一个main方法测试
[code]public static void main(String[] args) {        //直接获取消息        System.out.println(getJsonMessage(Code.OK, "请求成功"));        //构建更加复杂的消息        System.out.println((String) newMessageBuilder()                //修改默认Code的标识                .code(Code.OK.setFlag(0))                .message("成功")                .addMsg("totalNum", 1000)                .getFinalMessage());        //对消息加密        String message = "你好世界";        String en = BASE64_ENCRYPTOR.encrypt(AES_ENCRYPTOR.encrypt(message.getBytes(), "autoJob!@#=123.?"), null);        System.out.println("加密后:" + en);        System.out.println("解密后:" + new String(AES_DECIPHER.decrypt(BASE64_DECIPHER.decrypt(en.getBytes(), null), "autoJob!@#=123.?")));        System.out.println("/*=================创建可以复用的消息发送器和接收器=================>*/");        //创建使用RSA加/解密的发送/接收器        KeyPair keyPair = RSA_ENCRYPTOR.generateKeyPair(2048);        MessageSender sender = newMessageSenderWrapper(new MessageSender())                //可以尝试使用其他序列化器                .setSerializer(PROTO_STUFF_SERIALIZER)                //可以尝试使用其他加密器                .setEncryptor(RSA_ENCRYPTOR, keyPair.getPublic(), Charset.defaultCharset(), true)                .wrap();        MessageReceiver receiver = newMessageReceiverBuilder(new MessageReceiver())                //必须和发送器序列化器对应                .setDeserializer(PROTO_STUFF_DESERIALIZER, String.class)                //必须和发送器加密器对应                .setDecipher(RSA_DECIPHER, keyPair.getPrivate(), Charset.defaultCharset(), true)                .wrap();        String msg = sender.getFinalMessage("你好世界");        System.out.println(msg);        System.out.println(receiver.getFinalMessage(msg));        System.out.println("/*=======================Finished======================*/");        //序列化        byte[] senderContent = getMessage(sender, PROTO_STUFF_SERIALIZER);        byte[] receiverContent = getMessage(receiver, PROTO_STUFF_SERIALIZER);        //反序列化        MessageSender savedSender = MessageSender.fromBytes(senderContent, PROTO_STUFF_DESERIALIZER);        MessageReceiver savedReceiver = MessageReceiver.fromBytes(receiverContent, PROTO_STUFF_DESERIALIZER);        //反序列化后发送消息        String sMsg = savedSender.getFinalMessage("你好世界");        System.out.println(sMsg);        System.out.println(savedReceiver.getFinalMessage(sMsg));        System.out.println("/*=======================Finished======================
您需要登录后才可以回帖 登录 | 立即注册