2013-02-06 3 views
0

그래서 나는 다음과 같은 코드를 사용하여 네트워크 스트림을 통해 '패킷'클래스를 보내려고 오전 :는 NetworkStream을 통해 클래스를 보내기

IFormatter formatter = new BinaryFormatter(); 
NetworkStream stream = client.GetStream(); 
formatter.Serialize(stream, packet); 


stream.Flush(); 
stream.Close(); 
client.Close(); 

이 클래스를 사용하여 :

[Serializable] 
public class Packet 
{ 

    public string header; 
    public string content; 
    public int size = 0; 

    public Packet(string header, string content) 
    { 
     this.header = header; 
     this.content = content; 

     size = Encoding.ASCII.GetByteCount(header) + Encoding.ASCII.GetByteCount(content); 
    } 
} 

을하지만 무엇입니까 다른 측면에서 읽기 다음과 같은 오류가 :

'System.Runtime.Serialization.SerializationException: Unable to find assembly 'Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.' 

이 내 독서 코드 :

NetworkStream ns = client.GetStream(); 
IFormatter formatter = new BinaryFormatter(); 
Packet p = (Packet)formatter.Deserialize(ns); 
MessageBox.Show(p.header); 
return p; 

왜 이런 일이 발생하는지 알고 싶습니다.

편집 :

서버 측 패킷 클래스 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Server 
{ 

    public class Packet 
    { 
     public string header; 
     public string content; 
     public int size = 0; 

     public Packet(string header, string content) 
     { 
      this.header = header; 
      this.content = content; 

      size = Encoding.ASCII.GetByteCount(header) + Encoding.ASCII.GetByteCount(content); 
     } 
    } 
} 
+0

예외를 throw하는 행은 무엇입니까? "클라이언트"를 초기화하는 전체 코드를 게시 할 수 있습니까? –

+0

'패킷 p = (패킷) 포매터.Deserialize (ns);' 오류가 발생하는 곳입니다. –

+0

클라이언트와 서버 측 응용 프로그램에서 Packet 클래스 (유형)를 어떻게 공유하고 있습니까? 그것은 자체 어셈블리의 일부입니까? –

답변

2

개체를 하나의 어셈블리에서 이진 직렬화하고 다른 어셈블리의 클래스에 대해이를 deserialize 할 수 없습니다.

클라이언트와 서버 모두에서 참조하는 세 번째 어셈블리가 있어야합니다.

+0

thanks :) 두 프로젝트 모두에서 DLL을 만들었습니다. 매력처럼 일했습니다. –

1

당신이 경우 BinaryFormatter에서 deserialise 때 클래스가 사용할 수 있어야합니다. 이것이 오류의 의미입니다.

Packet 클래스가 Client.dll에 정의되어 있다고 가정합니다. 그렇다면 "서버"프로젝트에서 Client.dll을 참조하고 서버에서 패킷 정의를 제거하십시오.

일반적으로 클라이언트와 서버와 공유 할 수있는 DataModel 어셈블리가 있어야합니다.

또한 BinaryFormatter 대신 XmlSerializer을 사용하면 클라이언트와 서버 모두에서 클래스의 구현이 다를 수 있습니다.

0

두 개의 별도의 (기능은 동일하지만) 패킷 클래스를 만들었고 클라이언트는 동일한 이름과 구조를 가지고 있더라도 직렬화 된 것과 다른 유형의 직렬화를 역 직렬화 할 수 없습니다.

별도의 세 번째 프로젝트/클래스 라이브러리 유형의 어셈블리에서 패킷 클래스를 정의 해보십시오. 그런 다음 클라이언트 또는 서버에서 프로젝트 또는 어셈블리를 참조하십시오. 이 클래스 라이브러리에 Interface IPacket을 정의하고 클라이언트와 서버 모두에 구현하면됩니다.

희망이 있습니다.