C# memcached的序列化

C# memcached的序列化,c#,serialization,caching,memcached,C#,Serialization,Caching,Memcached,我有一个巨大的域对象(比如父对象),它包含其他域对象。通过查询数据库来“创建”这个父对象需要很多时间(好的,我们正在优化数据库)。所以我们决定使用memcached缓存它(具体来说) 因此,我检查了我的代码,并将所有类(我认为)标记为[Serializable],但当我将其添加到缓存时,我看到VS.net输出窗口中抛出了一个序列化异常 var cache = new NorthScaleClient("MyBucket"); cache.Store(StoreMode.Set, key, val

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

因此,我检查了我的代码,并将所有类(我认为)标记为
[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]
,但是当缓存尝试序列化对象时,如何找出哪个类失败


编辑1:casperOne的评论让我思考。我能够使用Microsoft cache应用程序块缓存这些域对象,而不将它们标记为
[Serializable]
,但不能使用NorthScale memcached。这让我觉得可能与它们的实现有关,但出于好奇,我仍然有兴趣找到在尝试将对象添加到memcached时失败的地方

转到“菜单调试->异常”并展开公共语言运行时异常,然后为
SerializationException
(System.Runtime.Serialization)选择适当的命名空间,并在为
SerializationException
引发异常时检查中断

通过这种方式,您可以检查抛出异常的详细信息


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

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


如果所有其他操作都失败,则为其指定对象的
字节[]
(如果失败,则为base64)。也就是说,我建议不要在这里使用
BinaryFormatter
——它确实如此,而且占用的带宽比需要的要多。我已经成功地改用了(,但使用了不同的实现);这是安全的,并且是版本安全的。我能帮你填一下吗?或者您可以使用protobuf net中的
ISerializable
钩子。

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


看到protobuf net的出现,我也在考虑切换我的序列化程序

@Ram:你有更多关于northscale要求的信息吗?这很可能是他们的问题,而不一定是框架的问题,因此更多关于他们需求的信息将非常有帮助。@casperOne:我们用“缓存”字符串进行了概念验证,它是有效的。当试图缓存域对象时,它会失败。我想这是我这边的事情。请看Edit1 Alsonic one。我还看到Jon也有类似的东西。看起来你的更容易使用,只需指定转码器。我会试一试的。我想我甚至不必将类标记为
[Serializable]
,只要它们标记为
[DataContract]
@Ram-请注意,[DataContract]需要在
[DataMember]
上明确(且唯一)的顺序-例如,
[DataMember(Order=1)]
<代码>[数据成员(订单=2)]等。