2009-10-09 3 views
3

네트워크 통신을 위해 Byte 배열에서 /로 개체를 직렬화 및 비 직렬화하려고하는데 현재 인터페이스 'ISerialize'가 있습니다. 그러나 나는 이것을 반영하기 위해보다 강력한 방법이 있어야한다고 생각해 왔습니다.C# 이진 직렬화

BinaryFormater를 사용하여이 작업을 조금 둘러 봤지만 필자가 필요한 컨트롤을 줄 수 있는지 알 수 없습니다.

편집 : (필드는 너무 오래 그들이 시스템 종류 또는도 [직렬화]이기 때문에 모든 유형이 될 수 있습니다) 다음과 같이 내가 클래스를 장식 beable 싶습니다

[Serializable] 
public class MyClass { 

    [NonSerialized] 
    SomeOtherClass _classFeild; 

    [Position (0)] 
    UInt16 _field1; 

    [Position (14)] 
    UInt32 _feild2; 

    //.......... 
} 

그리고 다음과 같은 기능은

void Test() { 
    MyObject = new MyClass(); 
    Byte[] raw; 
    raw = Serializer.Serialize (MyClass); // Results in _field1 at raw[0,1] 
              //   _field2 at raw[14-18] 

    MyClass Deserialized = Serializer.Deserialize<MyClass> (raw); 
} 

모든 필드가 networ로/교환되어있다 K 순서 (가 bigEndian)


은 또한 오히려 화이트리스트 필드는 오히려 사람들은 일하지 않는 블랙리스트보다 직렬화되는 것입니다. 그래서 문제는 프레임 워크를 사용하여이 작업을 수행 할 수 있습니까? 아니면 직접 구현을 작성해야합니까?

+0

(제거 내 대답

[DataContract] public partial class Root { [DataMember] public int Number { get; set; } [DataMember] public Partial[] Partials { get; set; } [DataMember] public IList<ulong> Numbers { get; set; } } 

및 발전기의 출력 특성 권리 귀하의 케이스에 맞는 -하지만 난 질문에 여분의 세부 사항 (귀하의 의견에서)을 추가하는 것이 더 좋을 것이라고 생각합니다 –

+0

입력 주셔서 감사합니다 모두 : D –

답변

3

BinaryWriterBitConverter에 적합한 사운드를 들려줍니다.

+0

BinaryWriter가 내가 찾고있는 기능을 제공하는지 확신하지 못합니다 (내 편집 참조). 그리고 실제로 ToHostOrder 내에서 BitConverter를 사용하고 있습니다. –

+0

DeSerialize 예제에서 비트 이동 작업 대신 BitConverter.ToUInt32를 사용하는 이유는 무엇입니까? – sipwiz

+0

논리적 인 이유가 없기 때문에, VB6에서 이식 할 때의 유물이 BitConverter를 사용하지 못했습니다. –

0

protobuf-net을 살펴보십시오. 그것은 당신이 원하는 것을 정확하게하기위한 훌륭한 도서관입니다. 타사 라이브러리이지만 C# 및 기타 여러 언어로 된 다른 라이브러리에서 읽을 수있는 잘 정의 된 형식으로 데이터를 저장합니다. 내가 나 자신을 사용하고 매우 기뻐했습니다 http://code.google.com/p/protobuf-net/wiki/GettingStarted

: 여기

그것을 사용하는 방법의 샘플입니다.

+0

저는 몇 가지 다른 프로젝트에 protobuf를 사용했습니다.불행히도 내가 통신하고있는 인터페이스는 오히려 그 방식으로 고정되어 있습니다. (C 스타일 구조체) –

0

나는 최근에 github에 넣은 프로젝트가 당신을위한 싸움일지도 모른다고 생각합니다. 사용할 수있는 가장 빠른 바이너리 시리얼 라이저가 될 것이며 오버 헤드가 없다고 주장한다. 모든 속성은 이진 값으로 직접 표현됩니다.

체크 아웃 : https://github.com/Toxantron/CGbR#binary-datacontract-serializer

입력은 이제 DataContract와 DataMember를 내가 그것을 생각하지 않는 한,

public byte[] ToBytes(byte[] bytes, ref int index) 
    { 
     // Convert Number 
     Buffer.BlockCopy(BitConverter.GetBytes(Number), 0, bytes, index, 4);; 
     index += 4; 
     // Convert Partials 
     // Two bytes length information for each dimension 
     Buffer.BlockCopy(BitConverter.GetBytes((ushort)(Partials == null ? 0 : Partials.Length)), 0, bytes, index, 2); 
     index += 2; 
     foreach(var value in Partials ?? Enumerable.Empty<Partial>()) 
     { 
      value.ToBytes(bytes, ref index); 
     } 
     // Convert Numbers 
     // Two bytes length information for each dimension 
     Buffer.BlockCopy(BitConverter.GetBytes((ushort)(Numbers == null ? 0 : Numbers.Count)), 0, bytes, index, 2); 
     index += 2; 
     foreach(var value in Numbers ?? Enumerable.Empty<ulong>()) 
     { 
      Buffer.BlockCopy(BitConverter.GetBytes(value), 0, bytes, index, 8);; 
      index += 8; 
     } 
     return bytes; 
    }