import * as flatbuffers from"flatbuffers"; // 이런식으로 불러올거 선언햇다고 가정
let builder = new flatbuffers.Builder(); // 플랫버퍼 선언 /* 스트링의 경우 아래처럼 빌더를 통해서 만들어야 한다 주의점은 아래처럼 ReqUser 테이블 데이터를 넣기 전에 미리 생성해야 함 안 하면 순서 오류 난다 */ let myName = builder.createString(crypto.randomUUID()); // 크립토는 무시 걍 아무 문자열 넣을려고 한거 ReqUser.startReqUser(builder); // 테이블 시작한다고 호출 ReqUser.addName(builder, myName); // 뭔가 데이터를 삽입할땐 항상 builder, 데이터 ReqUser.addGender( builder, Math.round(Math.random()) === 0 ? Gender.female : Gender.male ); ReqUser.addPhone( builder, Phone.createPhone(builder, 8210, getRandom(3), getRandom(4)) // 갯랜덤은 걍 아무숫자 가지고 오는 함수이므로 무시 ); let end = ReqUser.endReqUser(builder); // 테이블 다 썻으면 이렇게 닫고 그 위치?를 받아야함 builder.finish(end); // 위치값 저장
let ab = builder.asUint8Array(); // 빌더에서 arrayBuffer 만드러줌 let buf = Buffer.from(ab); // 버퍼로 변환
아래는 전송 코드 예시 axios 썻음
1 2 3 4 5 6 7
const { data } = await axios({ method: "post", url: "http://localhost:3000/save", data: buf, headers: { "Content-Type": "application/octet-stream" }, responseType: "arraybuffer", // 나중에 데이터 받을때도 바이너리이므로 arraybuffer로 });
서버
통신으로 바이너리를 받아서 플랫버퍼로 읽어보기
전에는 바이너리 받는 거 따로 작성했었는대 그럴 필요가 업음
바디파서에서 아래처럼 쓰면 바이너리 받을 수 있음
1
app.use(bodyParser.raw());
예로 Express에서 데이터를 받으면 아래처럼 플랫버퍼에 넣기만 하면 끝임
1 2 3 4 5 6 7
let byte = newUint8Array(req.body); let buf = new flatbuffers.ByteBuffer(byte); let params = ReqUser.getRootAsReqUser(buf);
let builder = new flatbuffers.Builder(); // 빌더 생성 let userEndList: number[] = []; users.forEach((user) => { let name = builder.createString(user.name); // 스트링 먼저 생성 필요 ResUser.startResUser(builder); // 유저 객체 시작 ResUser.addId(builder, user.id); // 이하 값 삽입 ResUser.addCreateAt(builder, BigInt(user.create_at)); // long의 경우 BigInt로 감싸줘야 됨 안 그러면 안됨... ResUser.addGender( builder, user.gender === 0 ? Gender.male : Gender.female ); ResUser.addName(builder, name); ResUser.addPhone( builder, Phone.createPhone( builder, user.first_phone_number, user.second_phone_number, user.third_phone_number ) ); let resUserEnd = ResUser.endResUser(builder); // 유저 객체 끝 userEndList.push(resUserEnd); // 끝난 위치 값 배열로 저장 }); /* 배열 결과를 보낼 테이블(=ResUserList) 시작 전에 createUsersVector 먼저 생성 해줘야 순서 오류 안남 */ let userVectorEnd = ResUserList.createUsersVector(builder, userEndList); ResUserList.startResUserList(builder); // 테이블 시작 ResUserList.addUsers(builder, userVectorEnd); // 위치 삽입 let end = ResUserList.endResUserList(builder); // 닫음
builder.finish(end); let result = builder.asUint8Array(); // 변환