>

자바에서 데이터 구조를 정의하는 정식적인 방법이 있습니까 (그리고 Kotlin 확장에 의해) 바이트 배열 또는 비트 순서로 바이트가 구조에 정의 된 순서대로 직렬화 될 수 있습니까?

C의 구조와 유사합니다.

편집 : 이에 더하여, 나는 데이터 구조를 정의하고 그 일부에 접근하는 간단하고 표현적인 방법을 원합니다. 예를 들어 의사 코드는 다음과 같습니다.

DataStructure Message {
    Bit newFlag;
    Bit genderFlag;
    Bit sizeFlag;
    Bit activeFlag;
    Bit[4] operation;
    Byte messageSize;
    Byte[] message; 
}

그러면 우리는 :

Message firstMessage = new Message(1, 0, 1, 0, b'0010', 11, "Hello there");

그리고 우리는 말할 수 있습니다 :

ByteArray serialisedMessage = firstMessage.toBytes();

우리에게 다음과 같은 배열을 제공 할 것입니다 :

[b'10100010', b'00001011', "Hello there" (but in bytes)]

그럼 우리가 할 수있는 일 :

firstMessage.genderFlag = 1;

.. 그리고 객체에서 .toBytes를 다시 실행하십시오.

분명히 자바에서이와 같은 일을하는 백만 가지 방법이 있지만, 내가 볼 수있는 한 구문 적으로 간단하지는 않습니다. 각 객체에 대한 Java에 따른 객체 직렬화) 메소드. 아마도 이것이 정식 방법 일 수도 있지만 C, Rust 및 erm, COBOL에 따라 더 간단하게 만드는 것이 좋습니다.

  • 답변 # 1

    실제 질문에 대한 답을 모르겠습니다.

    그러나 나는 그 질문 자체의 본질에 대한 생각을 제안 할 것이다. C는 고급 언어로 개발되지 않았습니다. 내가 들어 본 최고의 설명은 "구조화 된 어셈블러"이며, 사용 가능한 주소 지정 모드를 기반으로하는 연산자가 있습니다. 16 비트 머신은 처음 개발되었고, 어플리케이션에서 사용되는 표준으로 개발되지 않았지만 프로그래머가 여전히 매우 효율적인 코드를 작성할 수있는 충분한 제어를 가능하게하는 어셈블러보다 훨씬 쉬운 것으로 개발되었습니다. 이 작업을 수행 한 첫 두 가지 작업은 컴파일러와 운영 체제 였으므로 모바일 및 임베디드 개발자 외에는 아무도 요즘에 감사 할 수없는 방식으로 런타임 효율성이 매우 중요했습니다 (70 년대 초). "바이트가 구조에 정의 된 순서"는 제 생각에 자바 데이터를 생각하는 좋은 방법이 아닙니다. 프로그래머는 자신의 객체에서 필드의 순서를 알거나 신경 쓰지 않습니다. 저장되어 있는지 또는 저장되어 있는지 여부는 언어 정의의 일부가 아닙니다. 모든 라이브러리 또는이를 주장하는 것은 면책 조항을 작성하거나 자체 컴파일러를 가지고 있어야합니다. 내가 할 수없는 이유를 모르고 Java 사양을 따르는 이유는 모르지만 누군가가 귀찮게하는 이유를 모르겠습니다.

    이러한 이유를 스스로에게 물어보십시오. 그리고 좋은 대답이 있다면 여기에 넣으십시오. 궁금합니다.

  • 이전 angular - 하위 경로에 기본 구성 요소가 필요합니까
  • 다음 Javascript VM 환경에서 에테르를 전송하지 않는 견고성 코드