將對象轉化爲幀(tcp協議傳輸的byte數組).根據字節序和字節數 通用方法

最近做一個將對象轉換成tcp數據的功能,將對象按一定規律(字節序以及字節數)轉換爲byte數組,可以分類去解析,但是太麻煩了,代碼冗長.決定採取使用一個通用的方法去實現對象轉數組的功能

數據類似這種格式
這裏寫圖片描述

TcpTransfer
transfer object (with annotation ) to tcp byte array
將帶有註解的對象轉換爲tcp協議傳輸的byte數組

@Retention(RetentionPolicy.RUNTIME){
int order();
int level(); 
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),後期功能完善優化

開發經驗較弱,如有幸請指點

方法代碼在這裏github:https://github.com/fakefrog/TcpTransfer/tree/master

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章