【问题标题】:Serialization for memcachedmemcached 的序列化
【发布时间】:2010-04-01 17:57:41
【问题描述】:

我有这个包含其他域对象的巨大域对象(比如父级)。通过查询数据库来“创建”这个父对象需要很多时间(好的,我们正在优化数据库)。所以我们决定使用 memcached 缓存它(具体是northscale

所以我检查了我的代码并将所有类(我认为)标记为[Serializable],但是当我将它添加到缓存中时,我看到在我的 VS.net 输出窗口中抛出了一个序列化异常。

var cache = new NorthScaleClient("MyBucket");
cache.Store(StoreMode.Set, key, value);

这是个例外:

A first chance exception of type 'System.Runtime.Serialization.SerializationException' occurred in mscorlib.dll

所以我的猜测是,我没有将所有类都标记为[Serializable]。我没有使用任何第三方库,可以将任何类标记为[Serializable],但是当缓存尝试序列化对象时,如何找出哪个类失败了?

Edit1:casperOne cmets 让我思考。我能够使用 Microsoft Cache Application Block 缓存这些域对象,而无需标记它们[Serializable],但不能使用 NorthScale memcached。这让我觉得他们的实现可能与他们的实现有关,但出于好奇,我仍然有兴趣在尝试将对象添加到 memcached 时找到失败的地方

【问题讨论】:

  • @Ram:你有更多关于northscale要求的信息吗?这很可能是他们的问题,不一定是框架的问题,因此有关他们要求的更多信息将有很大帮助。
  • @casperOne:我们用“缓存”字符串做了一个概念证明,它可以工作。当试图缓存域对象时,那就是它失败的时候。我在想这是我这边的事情。另请参阅 Edit1

标签: c# serialization caching memcached


【解决方案1】:

BinaryFormatter 的常见遗漏是事件;如果您订阅了 不可 可序列化的对象,就会发生不好的事情。另外,您可能并不意味着 序列化订阅者。您可以将它们标记为[NonSerialized][field:NonSerialized]

如果一切都失败了,给它你的对象的byte[](或者如果失败,base64)。也就是说,我建议不要在这里使用BinaryFormatter - 它是brittle,并且占用的带宽超出了它的需要。我使用protobuf-net 取得了一些成功(see here,但实现不同);这是smaller, faster,并且版本安全。我也许可以帮您解决这个问题?或者你可以使用来自 protobuf-net 的 ISerializable 钩子。

【讨论】:

  • 不错的一个。我还看到 Jon 有类似的东西。看起来你的更容易使用,只需指定转码器。会试一试。而且我想我什至不必将课程标记为[Serializable],只要它们标记为[DataContract]
【解决方案2】:

转到菜单 Debug -> Exceptions 并展开 Common Language Runtime Exceptions,然后为 SerializationException (System.Runtime.Serialization) 选择适当的命名空间,并在 SerializationException 引发异常时检查中断。

这样你可以检查抛出异常的详细信息。

另请注意,第一次机会异常并不绝对意味着应用程序代码存在问题。

【讨论】:

    【解决方案3】:

    我就是这样解决的。当序列化失败时,NorthScale 没有抛出任何错误。我用二进制序列化序列化了我的域对象,并且能够找出哪些类失败了(因为它们没有被标记为[Serializable])。修复了它,它工作了

    看到 protobuf-net 的 results 我也在考虑切换我的序列化程序

    【讨论】:

      猜你喜欢
      • 2016-02-08
      • 1970-01-01
      • 2023-03-14
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 2011-01-08
      • 2012-07-03
      相关资源
      最近更新 更多