2012-12-30 1 views
4

데이터 스트림을 읽거나 쓰려면 이진 직렬화 개체를 사용하고 이전에 쓰기/읽기를 수행하려면 "인스턴스 클래스"을 DLL 파일로 컴파일해야합니다. 그들 사이에 같은 어셈블리가 맞습니까? "C#, 소켓 통신을 통한 이진 직렬화

private void doRead() 
{ 
    do 
    { 
     if (mClient.GetStream().CanRead) 
      { 
      System.Net.Sockets.NetworkStream strm = mClient.GetStream(); 

       IFormatter formatter = new BinaryFormatter(); 

       object mydat = (object)formatter.Deserialize(strm);//deserialize data receiver   
      } 
    } while (true); 
} 

그리고 이것은 내 입니다 :이 내 바이너리 발신자 번호

public void SendBinarySerial(object graph) 
{ 
    IFormatter formatter = new BinaryFormatter(); 

    System.Net.Sockets.NetworkStream strm = mClient.GetStream(); //get TCPclient stream 

    formatter.Serialize(strm, graph); 
} 

이며, 여기 내 바이너리 수신기 코드

:

잘 지금, 여기 내 문제입니다 인스턴스 클래스 " 코드를 전체 클라이언트에 보내고 싶습니다. 확인의 다음 코드를 살펴 보자 : 당신이 볼 수 있듯이

[Serializable()] 
public class DataSend 
{ 
    public List<Bitmap> MainData = new List<Bitmap>(); 
    public List<string> Title = new List<string>(); 
} 

이 같은 비트 맵 및 캐릭터 등 여러 가지 목록 변수가 있습니다. 비트 맵 데이터는 이미지 데이터 용입니다. 만약 내가 많은 이미지를 채우면 가변 메모리의 크기가 커질 것입니다. 어쩌면 약 20MB입니다.

그 후 나는 그들을 전체 고객에게 보냈습니다. 음, 내 질문은 여기에있다 :

이 기술을 사용하면 크기 객체가 약 20MB 인 경우이 기능이 잘 작동합니까? 소켓 통신에 데이터 전송에 대한 크기 제한이 있다는 것을 알고 있습니다.

나는 프로토콜을 전혀 정의하고 싶지 않습니다. 소켓 통신을 사용하고 싶습니다.하지만 이것은 최선의 방법은 아닙니다.

답장을 보내 주셔서 감사합니다.

+0

'CanRead' 검사를하지 마십시오. 아무 것도하지 않고 거짓이면 CPU의 100 % 굽기로 연결됩니다. 코드가 좋게 보입니다. – usr

답변

2

소켓을 사용하여 크기 제한에 대해 걱정하지 않아도됩니다. 필자의 경험에 따르면 NetworkStream에서 또는 NetworkStream에 임의의 크기를 읽고 쓸 수 있습니다. 그러나 비트 맵 객체의 serializability에 대해 걱정할 것입니다. 늘어나는만큼 내가이 이미지 데이터를 serialize하지 않습니다 알아요.

+0

Bitmap 클래스는 Serializable로 표시되며 Data를 사용하여 serialize하는 특정 코드를 구현합니다. –

0

파일 크기가 몇 MB를 넘으면 BinaryFormatter가 실제로 어려움을 겪습니다. 보다 정교한 직렬화 기술을 사용하는 open source communication library을 사용 해본 적이 있습니까? 될 것입니다 귀하의 전송 방법을 networkcomms.net 사용

(당신은 단지 RAW 객체를 제공하고 당신을 위해 직렬화의 모든 작업을 수행) :

NetworkComms.SendObject("DataPacket", ipAddress, port, object); 

를 수신 끝에 당신이 코드는 다음과 같습니다

NetworkComms.AppendGlobalIncomingPacketHandler<object>("DataPacket", (header, connection, incomingObject) => { object mydat = incomingObject; }); 
TCPConnection.StartListening(); 
+0

149 소켓을 통해 직렬화 된 객체를 전송할 때의 파운드가 약간입니까? 어쩌면 주머니에 그런 구멍이 생기지 않는 스트립 버전을 제공 할 수 있습니다. – lama12345

관련 문제