2017-04-25 12 views
0

다른 개체로부터 바이트 배열 구성하기 :C#을 편한 방법 내가 빨리하는 방법이 패러다임의 간단한 구현을 찾고

MyByteArray mb = new MyByteArray(); 
mb.Add<byte>(bytevalue); 
mb.Add<float>(floatvalue); 
mb.Add<string>(str); 
mb.Add<MyClass>(object); 

을 그리고 바이트 [] MB에서 바이트 패킷으로 보낼 수 RPC 호출을 통해 (동일한 기술을 사용하여 상대방에서 디코딩되도록).

나는 MemoryStream을 발견했으나 간단한 조작으로 인해 너무 오버 헤드 된 것처럼 보입니다.

도와 주시겠습니까? 고맙습니다.

답변

2

무엇을 찾고 계십니까? BinaryWritter입니다. 그러나 여전히 순수한 논리 이유 때문에 쓰려고 스트림이 필요합니다. 그리고 당신의 필요에 맞는 유일한 Stream은 MemoryStream입니다.

성능 오버 헤드가 두렵습니까? 기존 바이트 배열에서 MemoryStream을 만들 수 있습니다.

byte [] buffer = new byte[1024]; 
    using (var memoryStream = new MemoryStream(buffer)) 
    { 
     using (var binaryWriter = new BinaryWriter(memoryStream)) 
     { 
      binaryWriter.Write(1.2F); // float 
      binaryWriter.Write(1.9D); // double 
      binaryWriter.Write(1); // integer 
      binaryWriter.Write("str"); // string 
     } 
    } 
    // buffer is filled with your data now. 
0

이 프로토콜 버퍼의 경우처럼 보이는, 당신은 protobuf-net에서 볼 수 있었다.

먼저 클래스를 꾸미자.

[ProtoContract] 
class User 
{ 
    [ProtoMember(1)] 
    public int Id { get; set; } 

    [ProtoMember(2)] 
    public string Name { get; set; } 
} 

[ProtoContract] 
class Message 
{ 
    [ProtoMember(1)] 
    public byte Type { get; set; } 

    [ProtoMember(2)] 
    public float Value { get; set; } 

    [ProtoMember(3)] 
    public User Sender { get; set; } 
} 

그런 다음 메시지를 작성합니다.

var msg = new Message 
{ 
    Type = 1, 
    Value = 1.1f, 
    Sender = new User 
    { 
    Id = 8, 
    Name = "user" 
    } 
}; 

이제 ProtoBuf의 시리얼 라이저를 사용하여 모든 작업을 수행 할 수 있습니다.

// memory 
using (var mem = new MemoryStream()) 
{ 
    Serializer.Serialize<Message>(mem, msg); 
    var bytes = mem.GetBuffer(); 
} 

// file 
using (var file = File.Create("message.bin")) Serializer.Serialize<Message>(file, msg); 
0

이를 달성하기위한 교묘 한 방법은 당신이 상 implicit operator을 정의하는 사용자 정의 개체에 대한 .NET

class Program 
    { 
     static void Main(string[] args) 
     {  
      Program program = new Program(); 
      var listBytes = new List<byte>(); 
       listBytes.Add(program.CastToBytes("test")); 
       listBytes.Add(program.CastToBytes(5));   
     } 

에 내장 클래스의 조합을 사용하는 것이 얼마나 속성 또는 모든 객체를 변환해야합니다.

 public byte[] CastToBytes<T>(T value)    
     { 
      //this will cover most of primitive types 

      if (typeof(T).IsValueType) 
      { 
       return BitConverter.GetBytes((dynamic)value); 
      } 

      if (typeof(T) == typeof(string)) 
      { 
       return Encoding.UTF8.GetBytes((dynamic) value); 
      } 
      //for a custom object you have to define the rules 
      else 
      { 
       var formatter = new BinaryFormatter(); 
       var memoryStream = new MemoryStream(); 
       formatter.Serialize(memoryStream, value); 
       return memoryStream.GetBuffer();  
      }          
     } 

    }