【问题标题】:C# - Send a WinForm over TCPC# - 通过 TCP 发送 WinForm
【发布时间】:2018-02-13 13:35:52
【问题描述】:

我创建了一个客户端服务器应用程序,它目前能够以容器的形式发送消息:

[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,版本=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”中的“类型“System.Windows.Forms.Form”未标记为可序列化.'

我的问题有什么解决方法吗?

【问题讨论】:

  • 为什么要发送表单?
  • 这些表单是否已在客户端应用程序中定义?
  • 您要发送表格上的什么内容?发送一个Form是没有意义的,它是一个数据视图。
  • @BWA:最终结果是将表单存储为 SQL(二进制格式)
  • @Gizazas 你需要什么形式的二进制表示?为数据表示创建一个对象并将其分割并从中填写表格。

标签: c# .net winforms serialization


【解决方案1】:

我强烈建议您为尝试做的任何事情找到不同的方法。表单不可序列化。你可以:

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

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

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

基本上,这将是您最糟糕的噩梦,并且在您花费了尽可能多的时间之后,您最终会意识到您除了垃圾箱之外什么都没有。

【讨论】:

    【解决方案2】:

    您不能(合理地)序列化表单。

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

    public enum FormType
    {
        Products,
        Customers
    }
    
    public FormType RequestedForm { get; set; }
    

    【讨论】:

      【解决方案3】:

      发送表单是一个毫无意义的练习。表单只是用来显示数据。如果您希望显示某个表单,请发送它需要的数据而不是整个表单。

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

      【讨论】:

        猜你喜欢
        • 2013-07-21
        • 1970-01-01
        • 1970-01-01
        • 2010-12-16
        • 1970-01-01
        • 1970-01-01
        • 2012-08-10
        • 2010-12-16
        • 2015-03-03
        相关资源
        最近更新 更多