content: /*
   * Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to You under the Apache License, Version 2.0
   * (the "License"); you may not use this file except in compliance with
   * the License.  You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package com.alipay.remoting.serialization;
  
  import java.io.ByteArrayInputStream;
  import java.io.ByteArrayOutputStream;
  import java.io.IOException;
  
  import com.alipay.remoting.exception.CodecException;
  import com.caucho.hessian.io.Hessian2Input;
  import com.caucho.hessian.io.Hessian2Output;
  import com.caucho.hessian.io.SerializerFactory;
  
  /**
   * Hessian2 serializer.
   * 
   * @author jiangping
   * @version $Id: HessianSerializer.java, v 0.1 2015-10-4 PM9:51:55 tao Exp $
   */
  public class HessianSerializer implements Serializer {
  
      private SerializerFactory                         serializerFactory    = new SerializerFactory();
      private static ThreadLocal<ByteArrayOutputStream> localOutputByteArray = new ThreadLocal<ByteArrayOutputStream>() {
                                                                                 @Override
                                                                                 protected ByteArrayOutputStream initialValue() {
                                                                                     return new ByteArrayOutputStream();
                                                                                 }
                                                                             };
  
      /** 
       * @see com.alipay.remoting.serialization.Serializer#serialize(java.lang.Object)
       */
      @Override
      public byte[] serialize(Object obj) throws CodecException {
          ByteArrayOutputStream byteArray = localOutputByteArray.get();
          byteArray.reset();
          Hessian2Output output = new Hessian2Output(byteArray);
          output.setSerializerFactory(serializerFactory);
          try {
              output.writeObject(obj);
              output.close();
          } catch (IOException e) {
              throw new CodecException("IOException occurred when Hessian serializer encode!", e);
          }
          return byteArray.toByteArray();
      }
  
      /**
       * 
       * @see com.alipay.remoting.serialization.Serializer#deserialize(byte[], java.lang.String)
       */
      @SuppressWarnings("unchecked")
      @Override
      public <T> T deserialize(byte[] data, String classOfT) throws CodecException {
          Hessian2Input input = new Hessian2Input(new ByteArrayInputStream(data));
          input.setSerializerFactory(serializerFactory);
          Object resultObject;
          try {
              resultObject = input.readObject();
              input.close();
          } catch (IOException e) {
              throw new CodecException("IOException occurred when Hessian serializer decode!", e);
          }
          return (T) resultObject;
      }
  
  }
  