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;