blob: b69dd8b43c7f833b0bce4f1de8a629cf4ef8f156 [file] [log] [blame]
/*
* 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 org.apache.geode.pdx;
/**
* The PdxSerializer interface allows domain classes to be serialized and deserialized as PDXs
* without modification of the domain class. It only requires that the domain class have a public
* zero-arg constructor and that it provides read and write access to the PDX serialized fields.
* <p>
* GemFire allows a single PdxSerializer to be configured on a cache using
* {@link org.apache.geode.cache.CacheFactory#setPdxSerializer(PdxSerializer) setPdxSerializer} or
* {@link org.apache.geode.cache.client.ClientCacheFactory#setPdxSerializer(PdxSerializer) client
* setPdxSerializer}. It can also be configured in <code>cache.xml</code> using the
* <code>pdx-serializer</code> element. The same PdxSerializer should be configured on each member
* of a distributed system that can serialize or deserialize PDX data.
* <p>
* The {@link #toData toData} method is used for serialization; {@link #fromData fromData} is used
* for deserialization. The order in which fields are serialized and deserialized in these methods
* for the same class must match. For the same class toData and fromData must write the same fields
* each time they are called.
* <p>
* If you can modify your domain class then use {@link PdxSerializable} instead.
*
* <p>
* Simple example:
*
* <PRE>
* public class User {
* public final String name;
* public final int userId;
*
* public User(String name, int userId) {
* this.name = name;
* this.userId = userId;
* }
* }
*
*
* public class MyPdxSerializer implements PdxSerializer {
* public boolean toData(Object o, PdxWriter out) {
* if (o instanceof User) {
* User u = (User) o;
* out.writeString("name", u.name);
* out.writeInt("userId", u.userId);
* return true;
* } else {
* return false;
* }
* }
*
* public Object fromData(Class<?> clazz, PdxReader in) {
* if (User.class.isAssignableFrom(clazz)) {
* return new User(in.readString("name"), in.readInt("userId"));
* } else {
* return null;
* }
* }
* }
* </PRE>
*
* @since GemFire 6.6
*/
public interface PdxSerializer {
/**
* This method is given an object to serialize as a PDX using the given writer. If it chooses to
* do the serialization then it must return <code>true</code>; otherwise it must return
* <code>false</code> in which case it will be serialized using standard serialization.
*
* @param o the object to consider serializing as a PDX
* @param out the {@link PdxWriter} to use to serialize the object
* @return <code>true</code> if the method serialized the object; otherwise <code>false</code>
*/
boolean toData(Object o, PdxWriter out);
/**
* This method is given an class that should be instantiated and deserialized using the given
* reader.
*
* @param clazz the Class of the object that should be deserialized
* @param in the reader to use to obtain the field data
* @return the deserialized object. <code>null</code> indicates that this PdxSerializer does not
* know how to deserialize the given class.
*/
Object fromData(Class<?> clazz, PdxReader in);
}