1. 程式人生 > >TcpTransfer 將物件轉化為tcp協議傳輸的byte陣列(根據位元組序和位元組數)

TcpTransfer 將物件轉化為tcp協議傳輸的byte陣列(根據位元組序和位元組數)

最近做一個將物件轉換成tcp資料的功能,將物件按一定規律轉換為byte陣列,可以分類去解析,但是太麻煩了,程式碼冗長.決定採取使用一個通用的方法去實現物件轉陣列的功能

TcpTransfer transfer object (with annotation ) to tcp byte array 將帶有註解的物件轉換為tcp協議傳輸的byte陣列

@Retention(RetentionPolicy.RUNTIME) public @interface EncodeOrderAttribute { int level(); int order(); int size(); }

註解意義: level為層級,預設為最高3級,繼承的時候父類level為1,子類為2,子子類為3. order為當前層級順序,1為最優先,-1為優先順序最低 順序演算法為高層級包裹底層級, 解析A類,假如A類繼承自B,那麼B類的order為正的欄位按升序排列,再迭代考慮A類.再考慮B類Order為負欄位,-1為最後,-2為倒數第二. 支援一個類最多約100個欄位 size為此int轉換為的位元組數

對於下面示例:

@Data public class BasePersonBean {

@EncodeOrderAttribute(level = 1, order = 1, size = 1)
private Integer age;

@EncodeOrderAttribute(level = 1, order = 2, size = 1)
private Integer sex;
}

@Data public class TeacherBean extends BasePersonBean {

@EncodeOrderAttribute(level = 2,order = 1,size = 4)
private Integer studentCounts;

@EncodeOrderAttribute(level = 2,order = 2,size = 4)
private ArrayList<StudentBean> studentlist;

@EncodeOrderAttribute(level = 2,order = 3,size = 1)
private Integer teachingAge;
}

@Data public class StudentBean {

@EncodeOrderAttribute(level = 1,order = 1,size = 1)
private Integer age;

@EncodeOrderAttribute(level = 1,order = 2,size = 4)
private Integer money;

@EncodeOrderAttribute(level = 1,order = 3,size = 2)
private Integer friends;
}

建立例項實體:

StudentBean s1 = new StudentBean();
s1.setAge(20);
s1.setFriends(380);
s1.setMoney(1577878);
StudentBean s2 = new StudentBean();
s2.setAge(20);
s2.setFriends(380);
s2.setMoney(1577878);
StudentBean s3 = new StudentBean();
s3.setAge(20);
s3.setFriends(380);
s3.setMoney(1577878);
TeacherBean teacherBean = new TeacherBean();
teacherBean.setTeachingAge(30);
teacherBean.setStudentCounts(3);
ArrayList<StudentBean> studentList = new ArrayList<>();
studentList.add(s1);
studentList.add(s2);
studentList.add(s3);
teacherBean.setStudentlist(studentList);
teacherBean.setSex(1);
teacherBean.setAge(50);

byte[] bytes = ObjectToTcpBytes(teacherBean, teacherBean.getClass());
System.out.println(Arrays.toString(bytes));

解析teacherBean物件,結果為 : [50, 1, 0, 0, 0, 3, 20, 0, 24, 19, -106, 1, 124, 20, 0, 24, 19, -106, 1, 124, 20, 0, 24, 19, -106, 1, 124, 30] 50 -> age(BasePersonBean) 1 -> sex(BasePersonBean) 0,0,0,3 -> teacherBean.studentCounts 20-> teacherBean.studentlist[0].age 0, 24, 19, -106 -> teacherBean.studentlist[0].money 1, 124, ->teacherBean.studentlist[0].friends … … … 位元組序和位元組值沒有差錯

v1.0 基礎功能實現,一些核驗並未做,處於一個demo階段,可以進行初步使用(可能會有BUG),後期功能完善優化