由 'NHibernate.Spatial.Type.GeometryType' 处理的 'GeoAPI.Geometries.IGeometry' 不可序列化

'GeoAPI.Geometries.IGeometry' handled by 'NHibernate.Spatial.Type.GeometryType' is not Serializable

我们正在使用几个使用 NHibernate 的网络应用程序连接到 PostGIS 服务器。 我们的日志文件充斥着此警告:

the custom type 'GeoAPI.Geometries.IGeometry' handled by 'NHibernate.Spatial.Type.GeometryType' is not Serializable

我使用 Google 进行了搜索,看到很多其他人报告了同样的问题,但我没有找到任何解决方案。

我什至不确定这是 NHibernate 还是 GeoAPI 的问题。

非常感谢任何帮助。

我可以向您展示导致此警告的一系列事件。

  1. PostGisDialect.cs - 这是与 PostGIS 一起使用的方言。注意:

    public IGeometryUserType CreateGeometryUserType()
    {
        return new PostGisGeometryType();
    }
    
  2. PostGisGeometryType - 注意它实现了 GeometryTypeBase。

  3. GeometryTypeBase。注意:

    public System.Type ReturnedType
    {
        get { return typeof(IGeometry); }
    }
    
  4. GeometryType.cs - 现在 this 用于处理几何列映射。注意:

    this.geometryUserType = SpatialDialect.LastInstantiated.CreateGeometryUserType();
    ...
    public System.Type ReturnedType
    {
        get { return this.geometryUserType.ReturnedType; }
    }
    
  5. 最后一篇:CustomType:

    if (!userType.ReturnedType.IsSerializable)
    {
        LoggerProvider.LoggerFor(typeof(CustomType)).WarnFormat("the custom type '{0}' handled by '{1}' is not Serializable: ", userType.ReturnedType, userTypeClass);
    }
    

所以 GeometryType.ReturnValue 应该是可序列化的以避免这个警告。 GeometryType 使用 PostGisDialect,后者又使用 PostGisGeometryType,它继承自 GeometryTypeBase,后者 always returns IGeometry 因为它是 ReturnedType。当然,接口不能序列化,因此出现此警告(它应该对实际上从 GeometryTypeBase 继承的任何几何类型产生相同的警告,例如 Oracle 或 Sql Server)。实现 IGeometry 的实际类型实际上是可序列化的。

摘要是什么?我认为在这种情况下,此检查只是 returns 误报。也许它应该检查 ReturnType 是否是接口,在这种情况下不产生警告。在这里使用接口是完全合法的。

关于这个实际上有一个未解决的问题:here,已经有 2 年了,但他们没有深入挖掘以意识到实际问题似乎是什么。我会 post 他们 link 这个 post,也许他们会解决它。