¶Ô±ÈÐÂÎļþ |
| | |
| | | /* |
| | | * Copyright (c) 2018-2028, DreamLu All rights reserved. |
| | | * |
| | | * Redistribution and use in source and binary forms, with or without |
| | | * modification, are permitted provided that the following conditions are met: |
| | | * |
| | | * Redistributions of source code must retain the above copyright notice, |
| | | * this list of conditions and the following disclaimer. |
| | | * Redistributions in binary form must reproduce the above copyright |
| | | * notice, this list of conditions and the following disclaimer in the |
| | | * documentation and/or other materials provided with the distribution. |
| | | * Neither the name of the dreamlu.net developer nor the names of its |
| | | * contributors may be used to endorse or promote products derived from |
| | | * this software without specific prior written permission. |
| | | * Author: DreamLu 墿¥æ¢¦ (596392912@qq.com) |
| | | */ |
| | | package org.springblade.core.tool.utils; |
| | | |
| | | import io.protostuff.LinkedBuffer; |
| | | import io.protostuff.ProtostuffIOUtil; |
| | | import io.protostuff.Schema; |
| | | import io.protostuff.runtime.RuntimeSchema; |
| | | |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | |
| | | /** |
| | | * Protostuff å·¥å
·ç±» |
| | | * |
| | | * @author L.cm |
| | | */ |
| | | public class ProtostuffUtil { |
| | | |
| | | /** |
| | | * é¿å
æ¯æ¬¡åºååé½éæ°ç³è¯·Bufferç©ºé´ |
| | | */ |
| | | private static final LinkedBuffer BUFFER = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE); |
| | | /** |
| | | * ç¼åSchema |
| | | */ |
| | | private static final Map<Class<?>, Schema<?>> SCHEMA_CACHE = new ConcurrentHashMap<>(); |
| | | |
| | | /** |
| | | * åºååæ¹æ³ï¼ææå®å¯¹è±¡åºååæåèæ°ç» |
| | | * |
| | | * @param obj obj |
| | | * @param <T> T |
| | | * @return byte[] |
| | | */ |
| | | @SuppressWarnings("unchecked") |
| | | public static <T> byte[] serialize(T obj) { |
| | | Class<T> clazz = (Class<T>) obj.getClass(); |
| | | Schema<T> schema = getSchema(clazz); |
| | | byte[] data; |
| | | try { |
| | | data = ProtostuffIOUtil.toByteArray(obj, schema, BUFFER); |
| | | } finally { |
| | | BUFFER.clear(); |
| | | } |
| | | return data; |
| | | } |
| | | |
| | | /** |
| | | * ååºååæ¹æ³ï¼å°åèæ°ç»ååºååææå®Classç±»å |
| | | * |
| | | * @param data data |
| | | * @param clazz clazz |
| | | * @param <T> T |
| | | * @return T |
| | | */ |
| | | public static <T> T deserialize(byte[] data, Class<T> clazz) { |
| | | Schema<T> schema = getSchema(clazz); |
| | | T obj = schema.newMessage(); |
| | | ProtostuffIOUtil.mergeFrom(data, obj, schema); |
| | | return obj; |
| | | } |
| | | |
| | | /** |
| | | * è·åSchema |
| | | * @param clazz clazz |
| | | * @param <T> T |
| | | * @return T |
| | | */ |
| | | @SuppressWarnings("unchecked") |
| | | private static <T> Schema<T> getSchema(Class<T> clazz) { |
| | | Schema<T> schema = (Schema<T>) SCHEMA_CACHE.get(clazz); |
| | | if (Objects.isNull(schema)) { |
| | | //è¿ä¸ªschemaéè¿RuntimeSchemaè¿è¡æå建并ç¼å |
| | | //æä»¥å¯ä»¥ä¸ç´è°ç¨RuntimeSchema.getSchema(),è¿ä¸ªæ¹æ³æ¯çº¿ç¨å®å
¨ç |
| | | schema = RuntimeSchema.getSchema(clazz); |
| | | if (Objects.nonNull(schema)) { |
| | | SCHEMA_CACHE.put(clazz, schema); |
| | | } |
| | | } |
| | | return schema; |
| | | } |
| | | |
| | | } |