C# 通过networkstream发送类
因此,我尝试通过网络流发送“Packet”类,代码如下:C# 通过networkstream发送类,c#,serialization,networkstream,C#,Serialization,Networkstream,因此,我尝试通过网络流发送“Packet”类,代码如下: IFormatter formatter = new BinaryFormatter(); NetworkStream stream = client.GetStream(); formatter.Serialize(stream, packet); stream.Flush(); stream.Close(); client.Close(); 使用此类: [Serializable] public class Packet {
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);
}
}
}
从BinaryFormatter反序列化时,该类必须可用。这就是错误所说的 我假设Packet类是在Client.dll中定义的。如果是这样,那么只需在“服务器”项目中引用Client.dll,并删除服务器中的数据包定义 一般做法是拥有一个可以与客户机和服务器共享的数据模型程序集
另外,如果使用
XmlSerializer
而不是BinaryFormatter,则可以在客户端和服务器上实现该类的不同实现。从BinaryFormatter反序列化时,该类必须可用。这就是错误所说的
我假设Packet类是在Client.dll中定义的。如果是这样,那么只需在“服务器”项目中引用Client.dll,并删除服务器中的数据包定义
一般做法是拥有一个可以与客户机和服务器共享的数据模型程序集
另外,如果您使用
XmlSerializer
而不是BinaryFormatter,那么您可以在客户端和服务器上使用不同的类实现。您不能从一个程序集对对象进行二进制序列化,并针对另一个程序集的类对其进行反序列化
您需要有从客户端和服务器引用的第三个程序集。您不能从一个程序集对对象进行二进制序列化,然后根据另一个程序集的类对其进行反序列化
您需要有从客户端和服务器引用的第三个程序集。您已经创建了两个独立的(虽然功能相同)数据包类,并且您的客户端无法反序列化与序列化的数据包类型不同的类型,即使它们具有相同的名称和结构 尝试在类库类型的单独第三个项目/程序集中定义数据包类。然后,从客户端和服务器引用该项目或程序集。更准确地说,您可以在这个类库中定义一个接口IPacket,并在客户端和服务器中实现它
希望这会有所帮助。您已经创建了两个独立的(虽然功能相同)数据包类,并且您的客户端无法反序列化与序列化的数据包类不同的类型,即使它们具有相同的名称和结构 尝试在类库类型的单独第三个项目/程序集中定义数据包类。然后,从客户端和服务器引用该项目或程序集。更准确地说,您可以在这个类库中定义一个接口IPacket,并在客户端和服务器中实现它
希望这有帮助。哪一行抛出异常?你能在初始化“客户机”的地方发布完整的代码吗?“数据包p=(数据包)格式化程序。反序列化(ns);”是发送错误的位置。您如何与客户端共享服务器端应用程序中的数据包类(类型)?它是它自己的程序集的一部分吗?我服务器上的包类是它自己的程序集。客户机/服务器是独立的项目。我现在就发布代码。你需要把包类放在一个单独的类库中。您需要从服务器和客户端项目引用此类库。确保不使用客户机或服务器项目中定义的任何其他“数据包”类。哪一行引发异常?你能在初始化“客户机”的地方发布完整的代码吗?“数据包p=(数据包)格式化程序。反序列化(ns);”是发送错误的位置。您如何与客户端共享服务器端应用程序中的数据包类(类型)?它是它自己的程序集的一部分吗?我服务器上的包类是它自己的程序集。客户机/服务器是独立的项目。我现在就发布代码。你需要把包类放在一个单独的类库中。您需要从服务器和客户端项目引用此类库。请确保不使用在客户端或服务器项目中定义的任何其他“数据包”类。谢谢:)我为这两个项目创建了一个dll。我为两个项目都创建了一个dll。工作得很有魅力。