"GeoAPI.Geometries.IGeometry", обработанный "NHibernate.Spatial.Type.GeometryType", не является сериализуемым
Мы используем несколько веб-приложений, использующих 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(); }
PostGisGeometryType - обратите внимание, что он реализует GeometryTypeBase.
GeometryTypeBase. Обратите внимание, что:
public System.Type ReturnedType { get { return typeof(IGeometry); } }
GeometryType.cs - теперь этот используется для обработки ваших отображений столбцов геометрии. Обратите внимание, что:
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, который всегда возвращает IGeometry в качестве своего ReturnedType. Конечно, интерфейс не может быть сериализуемым, следовательно, это предупреждение (и оно должно выдавать то же предупреждение для любого типа геометрии, который на самом деле наследуется от GeometryTypeBase, например Oracle или Sql Server). Фактические типы, которые реализуют IGeometry, фактически сериализуемы.
Что такое резюме? Я думаю, что эта проверка просто возвращает ложное срабатывание в этом случае. Возможно, он должен проверить, является ли ReturnType интерфейсом, и в этом случае не выдает предупреждение. Использование интерфейса здесь абсолютно законно.
На самом деле есть открытая проблема по этому поводу: здесь, которому 2 года, но они не копали достаточно глубоко, чтобы понять, какова реальная проблема, кажется. Я выложу им ссылку на этот пост, возможно они это исправят.