C# 通过networkstream发送类

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 {

因此,我尝试通过网络流发送“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。工作得很有魅力。