Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#客户端-服务器模块,序列化不起作用_C#_Serialization_Stream_Network Programming_Client - Fatal编程技术网

C#客户端-服务器模块,序列化不起作用

C#客户端-服务器模块,序列化不起作用,c#,serialization,stream,network-programming,client,C#,Serialization,Stream,Network Programming,Client,首先,我想界定问题 我将编写客户端和服务器之间的通信模块 客户做什么 -将Raport发送到服务器-->sendReport(Raport-Raport) -从服务器-->getReport()方法获取specyfic Raport -获取有关可用raports的信息列表-->getRaportsInfo() 客户端类 服务器做什么? -获取来自客户端的请求(基于流中的第一个字节) 服务器类 报告类 namespace OtherClasses { [Serializable

首先,我想界定问题
我将编写客户端和服务器之间的通信模块
客户做什么
-将Raport发送到服务器-->sendReport(Raport-Raport)
-从服务器-->getReport()方法获取specyfic Raport
-获取有关可用raports的信息列表-->getRaportsInfo()

客户端类

服务器做什么?
-获取来自客户端的请求(基于流中的第一个字节)
服务器类

报告类

    namespace OtherClasses
   {
   [Serializable]
   public class Raport
   {
    public int day;
    public int month;
    public int year;

    public Raport(int d, int m, int y)
    {
        day = d;
        month = m;
        year = y;
    }

    public void show()
    {

        Console.WriteLine("DAY=" + day + " MONTH=" + month + "YEAR=" + year);

    }

}
}

电源中的某个地方

 Server s = new Server();
 s.acceptConnection();
 Client c = new Client();
 Raport r1 = new Raport(1, 1, 1);
 c.connect("127.0.0.1");
 c.sendReport(r1); 
问题:显然,从流中读取第一个字节后,我无法反序列化
我收到错误“输入流不是有效的二进制格式。”

SerializationException
在读取第一个字节后,如何从流中反序列化可能在类中包含该命令?使用不同的类来指定所需的数据。比如:

public enum RaportType {specific,general};

[Serializable]
public class RaportSpecific
{
    public List<string> Data = new List<string>() { "One", "Two" };
}

[Serializable]
public class Raport
{
    public RaportType RaportType = RaportType.specific;
    public RaportSpecific Test = null;   //new RaportSpecific();

该Raport类是否复制到两个项目中?或者这两个项目都引用的是库(dll)?顺便说一句,BinaryWriter和原始流的使用令人困惑,我认为这里不正确:您正在执行“write 3 on writer”、“serialize to stream”、“flush writer”。应该是“write3-on-writer”,“flush-writer”,“serialize-to-stream”。或者更好的是:“write3-to-stream,serialize-to-stream”(失去writer)额外的一点:你正在写的3不是一个字节。但是你读它的时候就好像它是一个字节一样。正如Marc所说的w.write((byte)3);它是有效的。
IFormatter formatter = new BinaryFormatter();
Raport receivedRaport = (Raport)formatter.Deserialize(n);
switch (receivedRaport.RaportType)
{

    case RaportType.general:
        Debug.WriteLine("You wanted to getRaportsInfo()");
        /// to be implemented
        break;

    case RaportType.specific:
        Debug.WriteLine("I've received your raport");
        receivedRaport.show();
        break;