2018-06-16 18:53:36
序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。反序列化顾名思义就是通过信息流对对象进行重建的过程。
一般来说序列化和反序列化有如下的作用:

public class SerializeandDeserializeTree {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuffer sb = new StringBuffer();
preOrder(root, sb);
return sb.toString();
}
private void preOrder(TreeNode root, StringBuffer stringBuffer) {
if (root == null) {
stringBuffer.append("00000");
}
else {
byte[] bytes = intToByte(root.val);
stringBuffer.append(‘1‘).append((char) bytes[0]).append((char) bytes[1]).append((char) bytes[2]).append((char) bytes[3]);
preOrder(root.left, stringBuffer);
preOrder(root.right, stringBuffer);
}
}
private byte[] intToByte(int val) {
return new byte[]{
(byte) (val >> 24),
(byte) (val >> 16),
(byte) (val >> 8),
(byte) val
};
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
return helper(data.toCharArray(), new int[]{0});
}
private TreeNode helper(char[] data, int[] pos) {
if (pos[0] >= data.length) return null;
if (data[pos[0]] == ‘0‘) {
pos[0] += 5;
return null;
}
int val =
(data[pos[0] + 1]) << 24 & 0xff000000 |
(data[pos[0] + 2]) << 16 & 0x00ff0000 |
(data[pos[0] + 3]) << 8 & 0x0000ff00 |
(data[pos[0] + 4]) << 0 & 0x000000ff;
pos[0] += 5;
TreeNode root = new TreeNode(val);
root.left = helper(data, pos);
root.right = helper(data, pos);
return root;
}
}
二、 二叉搜索树的序列化和反序列化
问题描述:
问题求解:
public class SerializeandDeserializeBST {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuffer sb = new StringBuffer();
preOrder(root, sb);
return sb.toString();
}
byte[] intToByte(int val) {
return new byte[]{
(byte)(val >> 24),
(byte)(val >> 16),
(byte)(val >> 8),
(byte)val
};
}
void preOrder(TreeNode root, StringBuffer sb) {
if (root != null) {
byte[] tmp = intToByte(root.val);
sb.append((char) tmp[0]).append((char) tmp[1]).append((char) tmp[2]).append((char) tmp[3]);
preOrder(root.left, sb);
preOrder(root.right, sb);
}
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
return helper(data.toCharArray(), new int[]{0}, Integer.MIN_VALUE, Integer.MAX_VALUE);
}
private TreeNode helper(char[] data, int[] pos, int low, int high) {
if(pos[0] >= data.length) return null;
int val =
data[pos[0] + 0] << 24 & (0xff000000) |
data[pos[0] + 1] << 16 & (0x00ff0000) |
data[pos[0] + 2] << 8 & (0x0000ff00) |
data[pos[0] + 3] << 0 & (0x000000ff);
if(val < low || val > high) return null;
TreeNode root = new TreeNode(val);
pos[0] += 4;
root.left = helper(data, pos, low, val);
root.right = helper(data, pos, val, high);
return root;
}
int byteToInt(byte[] bytes) {
return
bytes[0] & (0xff000000) |
bytes[1] & (0x00ff0000) |
bytes[2] & (0x0000ff00) |
bytes[3] & (0x000000ff);
}
}
原文:https://www.cnblogs.com/TIMHY/p/9191122.html