由 '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 的问题。
非常感谢任何帮助。
我可以向您展示导致此警告的一系列事件。
PostGisDialect.cs - 这是与 PostGIS 一起使用的方言。注意:
public IGeometryUserType CreateGeometryUserType()
{
return new PostGisGeometryType();
}
PostGisGeometryType - 注意它实现了 GeometryTypeBase。
GeometryTypeBase。注意:
public System.Type ReturnedType
{
get { return typeof(IGeometry); }
}
GeometryType.cs - 现在 this 用于处理几何列映射。注意:
this.geometryUserType = SpatialDialect.LastInstantiated.CreateGeometryUserType();
...
public System.Type ReturnedType
{
get { return this.geometryUserType.ReturnedType; }
}
最后一篇: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,也许他们会解决它。
我们正在使用几个使用 NHibernate 的网络应用程序连接到 PostGIS 服务器。 我们的日志文件充斥着此警告:
the custom type 'GeoAPI.Geometries.IGeometry' handled by 'NHibernate.Spatial.Type.GeometryType' is not Serializable
我使用 Google 进行了搜索,看到很多其他人报告了同样的问题,但我没有找到任何解决方案。
我什至不确定这是 NHibernate 还是 GeoAPI 的问题。
非常感谢任何帮助。
我可以向您展示导致此警告的一系列事件。
PostGisDialect.cs - 这是与 PostGIS 一起使用的方言。注意:
public IGeometryUserType CreateGeometryUserType() { return new PostGisGeometryType(); }
PostGisGeometryType - 注意它实现了 GeometryTypeBase。
GeometryTypeBase。注意:
public System.Type ReturnedType { get { return typeof(IGeometry); } }
GeometryType.cs - 现在 this 用于处理几何列映射。注意:
this.geometryUserType = SpatialDialect.LastInstantiated.CreateGeometryUserType(); ... public System.Type ReturnedType { get { return this.geometryUserType.ReturnedType; } }
最后一篇: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,也许他们会解决它。