最好能简单一些,我想这样做, 但是碰到大小端的转换问题,不知道有没有什么现成的开源的模块可以用
import java.io.*;
import java.lang.reflect.*;public abstract class LassoSerializable {
public void write(OutputStream os) {
DataOutputStream dos = new DataOutputStream(os);
try {
for (Field f : getClass().getFields()) {
Class<?> c = f.getType();
if (c == int.class) {
dos.writeInt(f.getInt(this));
} else if (c == short.class) {
dos.writeShort(f.getShort(this));
} else if (c == byte.class) {
dos.writeByte(f.getByte(this));
} else if (c == int[].class) {
int[] b;
b = (int[]) f.get(this);
for (int a : b)
dos.writeInt(a);
} else if (c == short[].class) {
short[] b;
b = (short[]) f.get(this);
for (short a : b)
dos.writeShort(a);
} else if (c == byte[].class) {
byte[] b = (byte[]) f.get(this);
dos.write(b);
} else {
LassoSerializable b = (LassoSerializable) f.get(this);
b.write(os);
}
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} public void read(InputStream is) {
DataInputStream dis = new DataInputStream(is); for (Field f : getClass().getFields()) {
try {
Class<?> c = f.getType();
if (c == int.class) {
f.setInt(this, dis.readInt());
} else if (c == short.class) {
f.setShort(this, dis.readShort());
} else if (c == byte.class) {
f.setByte(this, dis.readByte());
} else if (c == int[].class) {
int[] b;
b = (int[]) f.get(this);
for (int i = 0; i < b.length; i++)
b[i] = dis.readInt();
} else if (c == short[].class) {
short[] b;
b = (short[]) f.get(this);
for (int i = 0; i < b.length; i++)
b[i] = dis.readShort();
} else if (c == byte[].class) {
byte[] b = (byte[]) f.get(this);
dis.read(b);
} else {
LassoSerializable b = (LassoSerializable) f.get(this);
b.read(is);
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
} public int size() {
int Size = 0;
for (Field f : getClass().getFields()) {
try {
Class<?> c = f.getType();
if (c == int.class) {
Size += 4;
} else if (c == short.class) {
Size += 2;
} else if (c == byte.class) {
Size += 1;
} else if (c == int[].class) {
int[] b;
b = (int[]) f.get(this);
Size += b.length * 4;
} else if (c == short[].class) {
short[] b = (short[]) f.get(this);
Size += b.length * 2;
} else if (c == byte[].class) {
byte[] b = (byte[]) f.get(this);
Size += b.length;
} else {
LassoSerializable b = (LassoSerializable) f.get(this);
Size += b.size();
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return Size;
}
}
import java.io.*;
import java.lang.reflect.*;public abstract class LassoSerializable {
public void write(OutputStream os) {
DataOutputStream dos = new DataOutputStream(os);
try {
for (Field f : getClass().getFields()) {
Class<?> c = f.getType();
if (c == int.class) {
dos.writeInt(f.getInt(this));
} else if (c == short.class) {
dos.writeShort(f.getShort(this));
} else if (c == byte.class) {
dos.writeByte(f.getByte(this));
} else if (c == int[].class) {
int[] b;
b = (int[]) f.get(this);
for (int a : b)
dos.writeInt(a);
} else if (c == short[].class) {
short[] b;
b = (short[]) f.get(this);
for (short a : b)
dos.writeShort(a);
} else if (c == byte[].class) {
byte[] b = (byte[]) f.get(this);
dos.write(b);
} else {
LassoSerializable b = (LassoSerializable) f.get(this);
b.write(os);
}
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} public void read(InputStream is) {
DataInputStream dis = new DataInputStream(is); for (Field f : getClass().getFields()) {
try {
Class<?> c = f.getType();
if (c == int.class) {
f.setInt(this, dis.readInt());
} else if (c == short.class) {
f.setShort(this, dis.readShort());
} else if (c == byte.class) {
f.setByte(this, dis.readByte());
} else if (c == int[].class) {
int[] b;
b = (int[]) f.get(this);
for (int i = 0; i < b.length; i++)
b[i] = dis.readInt();
} else if (c == short[].class) {
short[] b;
b = (short[]) f.get(this);
for (int i = 0; i < b.length; i++)
b[i] = dis.readShort();
} else if (c == byte[].class) {
byte[] b = (byte[]) f.get(this);
dis.read(b);
} else {
LassoSerializable b = (LassoSerializable) f.get(this);
b.read(is);
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
} public int size() {
int Size = 0;
for (Field f : getClass().getFields()) {
try {
Class<?> c = f.getType();
if (c == int.class) {
Size += 4;
} else if (c == short.class) {
Size += 2;
} else if (c == byte.class) {
Size += 1;
} else if (c == int[].class) {
int[] b;
b = (int[]) f.get(this);
Size += b.length * 4;
} else if (c == short[].class) {
short[] b = (short[]) f.get(this);
Size += b.length * 2;
} else if (c == byte[].class) {
byte[] b = (byte[]) f.get(this);
Size += b.length;
} else {
LassoSerializable b = (LassoSerializable) f.get(this);
Size += b.size();
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return Size;
}
}
比如说java定义一个类
class foo extends LassoSerializable
{
int id;
int value;
short msg;
byte[] data=new byte[6];
}
然后
foo a=new foo()
a.id=1;
a.value=2;
a.msg=0x123;
a.data[0]=0x41;
a.write(os);
os.flush();
我希望实际通过Socket发送的数据为
01 00 00 00 02 00 00 00 23 01 41 00 00 00 00 00
不知有没有现成的解决方案