【问题标题】:Changing server object representation without updating a client在不更新客户端的情况下更改服务器对象表示
【发布时间】:2011-08-24 00:47:33
【问题描述】:

我们有一个分布式系统,其中基于 Java 的服务器缓存与 C# 前端通信,目前通过对象序列化。

我们已经讨论了一段时间的一个“很高兴拥有”的功能是,当一个对象的服务器表示发生变化时,即我们添加一个新属性,我们不应该发布更新前端也是如此。现在这显然是不可能的——你改变了一个对象的结构,你改变了它的序列化形式,反序列化就不起作用了(或者充其量只能捕获它用来获取的东西,而没有新的字段)。

我想知道以前是否有人遇到过类似的问题,他们通过什么样的解决方案来解决它?办公室里的一个亮点建议我们将 XML 发送给客户端,它应该直接从该消息中包含的内容构建 UI——中间没有对象的构建——但这当然会带来自己的问题。

欢迎所有建议:)

干杯,

戴夫。

【问题讨论】:

    标签: c# java architecture client-server


    【解决方案1】:

    您可以将“额外字段”Map<String, Object> 定义为您计划更新的对象中的字段之一

    但是您仍然需要告诉客户端使用它(但即使他们不使用它仍然会被捕获)并且当客户端无法反序列化时,字段的新类型可能会破坏前端它

    【讨论】:

    • 有趣的是,我只是在和一位同事讨论类似的事情。 :) 在我们沿着这条路线前进之前,我可能会等着看我还有什么其他建议......
    【解决方案2】:

    我可能会看看 google 协议缓冲区。该协议在客户端和服务器端支持不同的协议版本。

    【讨论】:

    • 同意;但请注意,客户端仍然需要知道要查找哪些扩展(意外但仍然可用的字段) - 通常通过询问单独的元数据调用
    • 我在查看文档时注意到的一件事是,Google 承认它不适用于大型数据集,这在我们的应用程序中肯定是可能的。很高兴能意识到这一点,我可以想到一些在我以前的工作中可能受益的应用程序!
    【解决方案3】:
    1. 使用更灵活的序列化格式。
    2. 不要更改现有的 DTO,而是扩展它们

    通过这样做,服务器可以发送扩展 DTO,而客户端反序列化基本 DTO。

    许多序列化框架都有标记为可选的字段,您可以用它标记所有新字段。

    【讨论】:

    • 但是客户端不会显示可选字段,对吧?至少直到它被更新以识别它们? (或者我完全错过了重点?)
    猜你喜欢
    • 2017-05-21
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多