2009-12-10 2 views
1

UDP 패킷 스트림에 대해 일부 데이터를 직렬화하려고하는데 직렬화에서 많은 오버 헤드가 발생합니다. 1k Byte 배열로 FileData를 인코딩하면 2312 바이트가 반환됩니다. 내가 직접 인코딩하고 디코딩하지 않고도이 오버 헤드를 줄일 수 있을까요? "그 자신을"있는 유일한 옵션이 될 수 있도록F # 차별화 된 유니온을 직렬화해야하는 이유는 무엇입니까?

[<Serializable>] 
type Response = 
    | FileSize of String * int64 
    | FileData of int64 * byte[] 
with 
    static member Decode(packet : byte[]) = 
     use ms = new MemoryStream(packet) 
     let bf = new BinaryFormatter() 
     bf.Deserialize(ms) 
     |> unbox<Response> 

    member this.Encode() = 
     use ms = new MemoryStream() 
     let bf = new BinaryFormatter() 
     bf.Serialize(ms, this) 
     ms.GetBuffer() 

답변

2

경우 BinaryFormatter는 아마 상자를 최대한 간결 포맷입니다.

추가 오버 헤드가 발생하는 이유는 직렬화로 저장된 다른 모든 정보와 관련이 있습니다. 직렬화는 데이터를 저장하는 것이 아니라 메타 데이터 (즉, 모든 유형 등)를 전체 객체가 안전하게 재구성 될 수 있도록 저장합니다. 이로 인해 오버 헤드가 추가됩니다.

다행히도 데이터가 커질수록 오버 헤드가 증가하지 않습니다. 2k 바이트 배열을 저장했다면 ~ 2300 바이트 대신 ~ 3300 바이트가 돌아올 것입니다. 오버 헤드는 거의 일정해야합니다 (유형 정보가 변경되지 않는다면).

+0

빠른 답장을 보내 주셔서 감사합니다. 어쩌면 내가 닷넷에 대한 프로토 버퍼를 조사해야합니다. – gradbot

관련 문제