gpt4 book ai didi

java - 除了从C#移植到Java之外,还有其他更好的选择吗?

转载 作者:搜寻专家 更新时间:2023-10-31 19:49:40 25 4
gpt4 key购买 nike

我有一个用C#语言编写的现有库,该库包装了一个更底层的TCP/IP API,并将来自服务器(专有二进制协议(protocol))的网络消息作为.NET事件公开。我还提供了一个对象上的方法调用,该对象处理了将便捷的.NET类型(如System.DateTime)编码为API所需的二进制编码和定长结构(用于将消息发送到服务器)的复杂性。在此.NET库之上构建了很多现有的应用程序(内部使用和由第三方使用)。

最近,有人不愿意自己抽象TCP/IP,但是他们的环境绝对不是Windows(我假设为* nix,但我不是100%肯定),这是我们与之接触的人。 ,并且他们暗示他们的理想是Java可以调用的。

满足我的要求的最佳方法是什么,而无需我执行以下操作:

  • 现在将代码移植到Java(包括我们当前P/Invoke进行解压缩的非托管DLL)
  • 今后必须维护两个单独的代码库(即,进行相同的错误修复和功能增强两次)

    我考虑过的一件事是,将大多数核心TCP/IP功能重新编写为更具跨平台(C/C++)的某种功能,然后将.NET库更改为在此之上的薄层(P/调用?),然后在它上面也写一个类似的Java薄层(JNI?)。

    优点:
  • 我大部分时间只写一次东西。

  • 缺点:
  • 现在,大多数代码将不受管理-不是世界末日,但从生产力的角度来看(对我而言)不是理想的。
  • 更长的开发时间(将C#套接字代码移植到C/C++的速度不能像移植到Java一样快)[这是真的吗?]
  • 至此,底层API大部分都已包装好,并且该库非常稳定,因此可能没有很多新开发内容-仅将当前代码移植到Java并偶尔犯下bug可能并不坏-将来修复或公开两次新字段。
  • 当现有客户端应用程序运行的版本在其下运行时发生巨大变化时,可能会导致不稳定。 (在我脑海中,我可以想到32/64位问题,字节序问题以及在移植期间可能出现的一般错误,等等。)

  • 我简要考虑过的另一种选择是以某种方式将Mono绑定(bind)到Java,以便可以利用我已经拥有的所有现有C#代码。尽管对于必须使用它的Java开发人员来说,开发人员的体验将有多么流畅,但我并没有太清楚。我很确定大多数代码都可以在Mono下正常运行(除非解压缩P/Invoke,否则无论如何都应该将其移植到C#中)。

    理想情况下,如果可以的话,我不希望在我的代码和客户端Java应用程序之间添加TCP/IP,管道等其他层(因此WCF到Java端WS-DeathStar可能已淘汰)。我从未使用Java进行过认真的开发,但是我感到骄傲的是,该库目前对于第三方开发人员集成到他的应用程序中是小菜一碟(当然,只要他运行.NET即可: )),对于希望获得相同体验的Java开发人员,我希望能够保持同样的易用性。

    因此,如果有人对我提出的3个选项有意见(移植到Java并进行两次维护,移植到C并为.NET和Java编写瘦语言绑定(bind),或者尝试将Java和Mono集成),或者我有任何其他建议d喜欢听到他们的声音。

    谢谢

    编辑:在与客户的开发人员直接交谈后(即拆除损坏的电话AKA销售部门),要求已发生足够的变化,因此该问题不再非常适合我的当前情况。但是,我会悬而未决,希望我们能提出更多好的建议。

    在我的特定情况下,客户端实际上除了Solaris之外还运行Windows计算机(如今不是这样),并且很高兴我们在库的顶部编写一个应用程序(Windows服务),并提供了更简化和更小的功能。 TCP/IP API,以便他们对其进行编码。我们将把他们的简单消息转换为下游系统可以理解的格式,并将传入的响应转换回以供他们使用,以便他们可以继续通过其Java应用程序与此下游系统进行接口(interface)。

    在考虑了几个星期之后回到原始方案,我还有其他一些评论:
  • 如果您预先知道需要支持多种语言/平台,那么在顶部具有不同语言绑定(bind)的基于C的可移植库很可能是您的最佳选择。
  • 在* nix上,单个进程可以同时托管Java运行时和Mono运行时吗?我知道在早期版本的.NET中,您不能在同一进程中拥有两个不同的.NET运行时,但是我相信他们已经通过.NET 4解决了这一问题?如果可能的话,两者之间将如何通信?理想情况下,您希望像静态方法调用一样简单,并希望使用委托(delegate)来引发响应。
  • 如果Java和Mono之间没有简单的直接接口(interface)支持(方法和委托(delegate)等),则可以考虑使用带有 Protocol Buffer 的ZeroMQ或Apache Thrift之类的消息格式。由于ZeroMQ支持不同的传输,因此可以在进程内,进程间和网络上运行。
  • 最佳答案

    花更多的时间来确定需求,然后再决定实现。除非您知道需要什么,否则您就没有在设计之间进行选择的任何标准。

    例如,如果它是非Windows环境,则在其中的任何地方都没有.NET是没有意义的。

    关于java - 除了从C#移植到Java之外,还有其他更好的选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5690297/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com