NHibernate配置对象序列化失败问题求助
NHibernate Configuration序列化失败问题分析与解决
问题现象
对NHibernate的Configuration对象执行序列化操作时,抛出如下异常:
Unhandled exception. System.Runtime.Serialization.SerializationException: Type 'System.Type' in Assembly 'System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e' is not marked as serializable. at System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(Type type) at System.Runtime.Serialization.FormatterServices.<>c.<GetSerializableMembers>b__5_0(MemberHolder mh) at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory) at System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context) at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, SerializationBinder binder)
经排查,异常仅在配置中包含class Mapping的模型映射时出现,未添加任何映射时序列化可正常完成。
根因分析
NHibernate的Configuration对象在添加实体映射后,内部会持有对应实体的System.Type实例引用。而System.Type类型本身并未标记为可序列化,当序列化器尝试处理这些成员时,就会触发上述异常。
解决方法
- 不要直接序列化Configuration对象:
Configuration的设计定位是用于构建SessionFactory的配置载体,并非为序列化场景设计,内部包含大量无法序列化的类型引用。 - 提取可序列化的配置元数据:如果需要持久化配置信息,手动提取关键配置项(如连接字符串、方言名称、映射文件路径/程序集等),将这些简单类型封装为自定义的可序列化对象进行存储。后续需要使用时,再通过这些元数据重新构建
Configuration实例。 - 自定义序列化代理(不推荐):若必须序列化
Configuration,可实现ISerializable接口或使用序列化代理(Surrogate),在序列化时将System.Type转换为其AssemblyQualifiedName字符串存储,反序列化时再通过Type.GetType()重新解析类型。该方式需深入处理NHibernate内部结构,维护成本较高。
内容的提问来源于stack exchange,提问作者Krishna Pravesh
相关产品推荐
相关产品推荐

