Protoinect Attribution은 무엇을 의미합니까 (protobuf-net)
-
09-09-2019 - |
문제
에서 protobuf-net 구현, 무엇을합니까 프로토 로이클 속성은 의미하며 무엇을합니까?
예를 들어 감사하겠습니다.
나는 그것을 보았다 이 게시물에서 그리고 그것이 무엇을하는지 잘 모르겠습니다. 예제는 다음과 같습니다.
[Serializable,
ProtoContract,
ProtoInclude(50, typeof(BeginRequest))]
abstract internal class BaseMessage
{
[ProtoMember(1)]
abstract public UInt16 messageType { get; }
}
[Serializable,
ProtoContract]
internal class BeginRequest : BaseMessage
{
[ProtoMember(1)]
public override UInt16 messageType
{
get { return 1; }
}
}
또한, 프로토겐 도구?
해결책
죄송합니다, 나는 이것을 놓치려고하지 않았다 - 아아, 나는 모든 것을 보지 못한다.
문제의 세부 사항을 감안할 때, 나는 당신이 적어도 .proto에 익숙하다고 생각할 것입니다. 내가 틀렸다면 나를 수정하십시오.
[ProtoInclude]
많이 작동합니다 [XmlInclude]
~을 위한 XmlSerializer
- 또는 [KnownType]
~을 위한 DataContractSerializer
- (DE) 직렬화 중 유형의 서브 클래스를 인식 할 수 있습니다. 유일한 추가 사항은 각 하위 유형을 식별하기 위해 태그 (번호)가 필요하다는 것입니다 (고유해야하며 부모 유형의 필드와 충돌하지 않아야합니다).
재 양성자 : 아니요; 기본 사양 (Google의)은 상속을위한 조항을 제공하지 않습니다. 조금도, 따라서 Protogen (.Proto를 통해)은 이것을 표현하는 메커니즘이 없습니다. Protobuf-Net은 상속 지원을 제공합니다 확대, 그러나 메시지를 다른 구현과 전선에 적합하게 남겨 두는 방식으로 수행합니다. 밀고, 아마도 Google 사양의 새로운 확장 속성을 통해 Protogen 지원을 추가 할 수는 있지만 아직이 작업을 수행하지 않았습니다.
그래서; 예를 보려면; 그것은 사이의 상속 관계를 표현합니다 BaseMessage
그리고 BeginRequest
; 당신이하는지에 관계없이 :
Serialize<BaseMessage>(...)
Serialize<BeginRequest>(...)
- 어느 쪽이든, 그것은베이스에서 시작됩니다 (
BaseMessage
)) 그리고 위쪽으로 일한다. 그렇지 않습니다 바로 그거죠 사실 - 그것은 씁니다 데이터 로 시작BeginRequest
(그래서 우리가 있다는 것을 알고 있습니다BeginRequest
사막화 중에 가능한 빨리). 중요한 것은 부모 계약 유형의 필드가 포함되어 있고 시리얼 라이저는 실제 물체가 통과되었습니다 - 유형뿐만 아니라 말하다 그것은이다.
마찬가지로, 사용 여부에 관계없이 Deserilaization 동안 :
Deserialize<BaseMessage>(...)
Deserialize<BeginRequest>(...)
실제로 직렬화 된 유형을 얻을 수 있습니다 (아마도 BeginRequest
).
보닛 하에서, 호환성 목적 (넓은 프로토콜 버퍼 사양)을 위해 이것은 (오류를 용서하십시오. 내 .proto는 녹슬 었음) : 다음과 같습니다.
message BaseMessage {
optional BeginRequest beginRequest = 50;
optional uint32 messageType = 1;
}
message BeginRequest {
}
(재정의는 아마도 지정해서는 안됩니다 [ProtoMember]
, btw.
일반적으로 오름차순 태그 순서로 필드를 작성하지만 효율적인 사막화를 위해 엔진은 하위 클래스 데이터를 작성하기로 선택합니다. 첫 번째 (사양에 의해 명시 적으로 허용됨) - 즉, 그것은 같은 것을 씁니다 (당신은 이진을 상상해야합니다 ...) :
[tag 50, string][length of sub-message][body of sub-message][tag 1, int][value]
(이 경우 하위 메시지의 본문이 비어 있습니다)
그게 다루나요?