最好能简单一些,我想这样做, 但是碰到大小端的转换问题,不知道有没有什么现成的开源的模块可以用
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;
}
}

解决方案 »

  1.   

    java程序和java程序通信,当然可以用序列化,但是java程序和C++程序通信,C++不认识java的序列化数据的, 所以不能用java的序列化
    比如说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
    不知有没有现成的解决方案
      

  2.   

    每个数据类型有一个reverseBytes(),调用这个转换一下字节顺序就可以了
      

  3.   

    同志, 不能事事依靠api的, 虽然c++里有serialize()这类的现成涵数可用, 但是你怎么就不能争气一点, 自己动手写一下实现自己的serialize()呢? 你想想, 天地下那么多的web服务器, 有的是unix下的, 有的windows系统下的, 但无论他是什么, 我们的浏览器照看不误,  而浏览器也五花八门, 有firefox, 有navigator, 怎么我们没听说过写浏览器那帮程序员哭诉不知道怎么去序列化那些gif图和a片. 能不能争口气, 别用其他程序员做好的现成东西呢, 因为你也是程序员啊.