ThinkGeo.com    |     Documentation    |     Premium Support

Problem serializing WmtsAsyncLayer

We are in the process of upgrading our application from TG 10 to TG 14. When trying to serialize a WmtsAsyncLayer, using the GeoSerializer, we get the following exception:

System.InvalidOperationException: System.Net.Http.HttpClient is not marked as serializable
   at ThinkGeo.Core.GeoObjectModeler.CreateNodeForObject(Object serializationObject, GeoObjectNode baseObjectModel, String nodeName, Type parentType)
   at ThinkGeo.Core.GeoObjectModeler.CreateMemberNode(String memberName, Object memberValue, Type memberType, Object memberOwner, GeoObjectNode baseMemberNode)
   at ThinkGeo.Core.GeoObjectModeler.CreateNodeForNormalType(Object serializationObject, GeoObjectNode currentModel)
   at ThinkGeo.Core.GeoObjectModeler.CreateNodeForObject(Object serializationObject, GeoObjectNode baseObjectModel, String nodeName, Type parentType)
   at ThinkGeo.Core.GeoObjectModeler.CreateModelForObject(Object modelSource)
   at ThinkGeo.Core.GeoObjectModeler.CreateModel(Object objectToModel, GeoObjectModelerMemberTypes memberTypes, BindingFlags bindingFlags, GeoObjectModelerDefaultValueMode defaultValueMode)
   at ThinkGeo.Core.GeoSerializer.Serialize(Object objectToSerialize, String targetPathFilename)
   at MapUtilities.WorkingSet.SaveWorkingSet(SilvicsTocControl oToc, String& sCurrentFileName) in C:\Silvics\SilvicsAI TG 14\SpatialAI TG 14\SpatialAI\MapUtilities\Classes\WorkingSet.vb:line 217

I tried again, setting the HttpClient property to Nothing (null) and then get the following exception:

System.InvalidOperationException: System.Net.WebRequest+WebProxyWrapper is not marked as serializable
   at ThinkGeo.Core.GeoObjectModeler.CreateNodeForObject(Object serializationObject, GeoObjectNode baseObjectModel, String nodeName, Type parentType)
   at ThinkGeo.Core.GeoObjectModeler.CreateMemberNode(String memberName, Object memberValue, Type memberType, Object memberOwner, GeoObjectNode baseMemberNode)
   at ThinkGeo.Core.GeoObjectModeler.CreateNodeForNormalType(Object serializationObject, GeoObjectNode currentModel)
   at ThinkGeo.Core.GeoObjectModeler.CreateNodeForObject(Object serializationObject, GeoObjectNode baseObjectModel, String nodeName, Type parentType)
   at ThinkGeo.Core.GeoObjectModeler.CreateModelForObject(Object modelSource)
   at ThinkGeo.Core.GeoObjectModeler.CreateModel(Object objectToModel, GeoObjectModelerMemberTypes memberTypes, BindingFlags bindingFlags, GeoObjectModelerDefaultValueMode defaultValueMode)
   at ThinkGeo.Core.GeoSerializer.Serialize(Object objectToSerialize, String targetPathFilename)
   at MapUtilities.WorkingSet.SaveWorkingSet(SilvicsTocControl oToc, String& sCurrentFileName) in C:\Silvics\SilvicsAI TG 14\SpatialAI TG 14\SpatialAI\MapUtilities\Classes\WorkingSet.vb:line 217

So then I also set the WebProxy property to Nothing and got the following exception:

System.InvalidOperationException: System.Net.Http.HttpClientHandler is not marked as serializable
   at ThinkGeo.Core.GeoObjectModeler.CreateNodeForObject(Object serializationObject, GeoObjectNode baseObjectModel, String nodeName, Type parentType)
   at ThinkGeo.Core.GeoObjectModeler.CreateMemberNode(String memberName, Object memberValue, Type memberType, Object memberOwner, GeoObjectNode baseMemberNode)
   at ThinkGeo.Core.GeoObjectModeler.CreateNodeForNormalType(Object serializationObject, GeoObjectNode currentModel)
   at ThinkGeo.Core.GeoObjectModeler.CreateNodeForObject(Object serializationObject, GeoObjectNode baseObjectModel, String nodeName, Type parentType)
   at ThinkGeo.Core.GeoObjectModeler.CreateModelForObject(Object modelSource)
   at ThinkGeo.Core.GeoObjectModeler.CreateModel(Object objectToModel, GeoObjectModelerMemberTypes memberTypes, BindingFlags bindingFlags, GeoObjectModelerDefaultValueMode defaultValueMode)
   at ThinkGeo.Core.GeoSerializer.Serialize(Object objectToSerialize, String targetPathFilename)
   at MapUtilities.WorkingSet.SaveWorkingSet(SilvicsTocControl oToc, String& sCurrentFileName) in C:\Silvics\SilvicsAI TG 14\SpatialAI TG 14\SpatialAI\MapUtilities\Classes\WorkingSet.vb:line 217

Then I went on the set the HttpMessageHandler to Nothing and got this exception:

System.ArgumentException: Invalid name character in '9x0ProEqualSign'. The '9' character, 
hexadecimal value 0x39, cannot be included in a name.
   at System.Xml.XmlWellFormedWriter.CheckNCName(String ncname)
   at System.Xml.XmlWellFormedWriter.WriteStartElement(String prefix, String localName, String ns)
   at ThinkGeo.Core.XmlGeoSerializationFormatter.Save(GeoObjectNode node, XmlWriter xmlWriter)
   at ThinkGeo.Core.XmlGeoSerializationFormatter.Save(GeoObjectNode node, XmlWriter xmlWriter)
   at ThinkGeo.Core.XmlGeoSerializationFormatter.SaveCore(GeoObjectModel model, Stream stream)
   at ThinkGeo.Core.GeoSerializer.Serialize(Object objectToSerialize, String targetPathFilename)
   at MapUtilities.WorkingSet.SaveWorkingSet(SilvicsTocControl oToc, String& sCurrentFileName) in C:\Silvics\SilvicsAI TG 14\SpatialAI TG 14\SpatialAI\MapUtilities\Classes\WorkingSet.vb:line 217

So I’m out of ideas. Can you help?

Thanks!

Steve

It’s fixed in v14.5.0-beta044. The following code now works correctly. Pull the latest beta044 and have another try.

	var uri = new Uri(@"https://wmts.geo.admin.ch/1.0.0");
	var wmtslayer = new WmtsAsyncLayer(uri);
	wmtslayer.ActiveLayerName = "ch.swisstopo.pixelkarte-farbe-pk25.noscale";
	await wmtslayer.OpenAsync();

	var serializer = new GeoSerializer();
	var result = serializer.Serialize(wmtslayer);
	var newWmtsLayer = serializer.Deserialize(result);

Thanks,
Ben