C# - 通过TCP发送WinForm

问题描述 投票:0回答:3

我创建了一个客户端服务器应用程序,它当前能够将消息作为容器发送:

[Serializable]
public class MsgContainer
{
    public string TableName { get; set; }
    public bool SomethingBool { get; set; }
    public DataTable DataTableData { get; set; }
}

问题:根据用户的请求,我希望服务器能够发送表单

public Form requestedForm { get; set; }

问题(因为我已在网上阅读并在我的应用程序中尝试)WinForms不可序列化,这就是为什么我收到以下错误:

System.Runtime.Serialization.SerializationException:在程序集'System.Windows.Forms中输入'System'Windows.Forms.Form',Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'未标记为可序列化。

我的问题有解决方法吗?

c# .net winforms serialization
3个回答
5
投票

我强烈建议你找到一种不同的方法,无论你想做什么。表格不可序列化。你可以:

  • 创建一个可序列化的类来传输所有表单信息并基于它重新生成表单。
  • 为表单编写自己的序列化程序和反序列化程序。

无论哪种方式,您都需要克服以下许多问题,例如:

  • 表单中的组件也不可序列化。
  • 每个控件可能具有值或对也需要传输的数据源的绑定。
  • 您可以在表单中包含无限的不同对象和类,这些表单将成为主项目的一部分。一切都需要在服务器和客户端使用的库中。

基本上,这将是你最糟糕的噩梦,经过花费很多时间你可能花费在它上面,你最终会意识到你除了垃圾填充物之外什么都没有。


2
投票

你不能(合理地)序列化表格。

如果可行,更好的方法是将表单构建到客户端应用程序中。然后让服务器指示客户端打开哪个表单。可以选择使用枚举。

public enum FormType
{
    Products,
    Customers
}

public FormType RequestedForm { get; set; }

1
投票

发送表格是一个非常毫无意义的练习。表单就在那里显示数据。如果要显示某个表单,请发送所需的数据,而不是整个表单。

老实说,听起来你要么有一些非常错误的设计。或者想要一直做WebApplication。考虑一下你可能会陷入XY Problem

© www.soinside.com 2019 - 2024. All rights reserved.