| --- |
| title: Implement the IDataSerializable Interface |
| --- |
| |
| <!-- |
| 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. |
| --> |
| |
| To store your own data types in the cache, you implement the <%=vars.product_name%> `IDataSerializable` interface. |
| |
| Examples follow the procedure. |
| |
| **Procedure** |
| |
| 1. Implement the `ToData` function that serializes your data: |
| |
| ``` pre |
| void ToData(DataOutput output) |
| ``` |
| |
| The `ToData` function is responsible for copying all of the data fields for the object to the object stream. The `DataOutput` class represents the output stream and provides methods for writing the primitives in a network byte order. |
| |
| 2. Implement the `FromData` function that consumes a data input stream and repopulates the data fields for the object: |
| |
| ``` pre |
| void fromData (DataInput& input) |
| ``` |
| |
| The `DataInput` class represents the input stream and provides methods for reading input elements. The `FromData` function must read the elements of the input stream in the same order that they were written by `ToData`. |
| |
| 3. Implement the `ClassId` function to return an integer which is unique for your class (in the set of all of your user-defined classes). |
| |
| ## Simple BankAccount Class |
| |
| This example shows a simple class, `BankAccount`, that encapsulates the two `ints`, `customerId` and `accountId`: |
| |
| ``` pre |
| public class BankAccount |
| { |
| private int m_customerId; |
| private int m_accountId; |
| public int Customer |
| { |
| get |
| { |
| return m_customerId; |
| } |
| } |
| public int Account |
| { |
| get |
| { |
| return m_accountId; |
| } |
| } |
| public BankAccount(int customer, int account) |
| { |
| m_customerId = customer; |
| m_accountId = account; |
| } |
| } |
| ``` |
| |
| ## Implementing a Serializable Class |
| |
| To make `BankAccount` serializable, you implement the `IDataSerializable` interface as shown in this example: |
| |
| ``` pre |
| public class BankAccount : IDataSerializable |
| { |
| private int m_customerId; |
| private int m_accountId; |
| public int Customer |
| { |
| get |
| { |
| return m_customerId; |
| } |
| } |
| public int Account |
| { |
| get |
| { |
| return m_accountId; |
| } |
| } |
| public BankAccount(int customer, int account) |
| { |
| m_customerId = customer; |
| m_accountId = account; |
| } |
| // Our TypeFactoryMethod |
| public static IDataSerializable CreateInstance() |
| { |
| return new BankAccount(0, 0); |
| } |
| #region IDataSerializable Members |
| public void ToData(DataOutput output) |
| { |
| output.WriteInt32(m_customerId); |
| output.WriteInt32(m_accountId); |
| } |
| public void FromData(DataInput input) |
| { |
| m_customerId = input.ReadInt32(); |
| m_accountId = input.ReadInt32(); |
| return this; |
| } |
| public UInt32 ClassId |
| { |
| get |
| { |
| return 11; |
| } |
| } |
| public UInt32 ObjectSize |
| { |
| get |
| { |
| return (UInt32)(sizeof(Int32) + sizeof(Int32)); |
| } |
| } |
| } |
| ``` |
| |
| |