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),後期功能完善優化