ThinkGeo.com    |     Documentation    |     Premium Support

SerializationException as a Result of Setting DoNotLock

In the previous post "Overall component performance" from Carlos I was reading the comment from Edgar about things to do to improve performance.  One of the tips was to set LockLayerMode to DoNotLock.  When I do this none of my shape file layers draw.


In a test-bed application I have I set LockLayerMode to DoNotLock and I get a SerializationException, details of the exception are below.


Any information as to what might be causing this exception.  As long as I do not set DoNotLock my applications are fine.


I too am concerned about drawing performance and so am looking at anything to help speed up my application.


Thanks,


Dennis


System.Runtime.Serialization.SerializationException was unhandled

  Message=Type 'OverrideTextStyle.MainWindow+MyTextStyle' in Assembly 'OverrideTextStyle, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

  Source=mscorlib

  StackTrace:

       at System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type)

       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(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)

       at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)

       at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)

       at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)

       at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph)

       at ThinkGeo.MapSuite.Core.Layer.pRM=(Object gxc=)

       at ThinkGeo.MapSuite.Core.Layer.CloneDeepCore()

       at ThinkGeo.MapSuite.Core.ShapeFileFeatureLayer.CloneDeepCore()

       at ThinkGeo.MapSuite.Core.Layer.CloneDeep()

       at ThinkGeo.MapSuite.WpfDesktopEdition.LayerOverlay.UBc=(Layer URc=)

       at ThinkGeo.MapSuite.WpfDesktopEdition.LayerOverlay.<>c__DisplayClass2.<UpdateCopiedLayers>b__0()

       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)

       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)

       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)

       at System.Threading.ThreadHelper.ThreadStart()

 



Hi Dennis, 
  
 Thanks for your detailed information, from the stack track provided, seems that you create a custom "MyTextStyle" which is inherited from "TextStyle", I guess you missed marking the class with "[Serializable]" attribute. Please have a try and any question please let us know. 
  
 Thanks, 
 Johnny

Johnny,


Thanks for your tip about needing to specify 'serialization' in my inherited TextStyle Class as my prototype application no longer gets an Exception.  In addition, as I was hoping, the drawing speed is very much faster once the first read of the layer has been accomplished.


In attempting to apply the DoNoLock property to my production application there is an odd outcome.  When I set this property on my LayerOverlay none of my layers will display even though their IsVisible property is set to True.  If I set it to Lock or Default then all my layers are displayed as expected.


I make use of a second LayerOverlay for an InMemoryFeatureLayer and set the DoNotLock Property, and in this case these features are displayed on the map.


Would you offer an words of advice on what might be causing this?  And in this case I use the inherited TextStyle for only one layer and I removed that layer from being loaded so as to remove it from the equation.


Thanks,


Dennis


 



Johnny,


One thing I've discovered is that when DoNotLock is used setting the IsVisible Property on a ShapeFileFeatureLayer no longer has any affect.


Can you confirm this?


Dennis


 



 Hi Dennis,


 
For the problem "none of layers displayed", I guess there may be 2 possible reasons:
1. There is an exception thrown from the customized text style serialization, which make the style doesn't work.
2. If there are too many layers, it might throw an exception in deepClone through the serialization process. But not very sure now.
 
Can you provide further information on this problem? such as:
 
1. In the "LayerOverlay", which layers are invisible?  these layers are "ShapeFileFeatureLayer"? In these layers, they are using the customized text style?
2. In another "LayerOverlay" which contains a "InMemoryFeatureLayer", does it use the customized style?
 
 
On the 2nd issue, we made a demo to try reproducing it, but seems like everything works fine for us, please check the code as following:


            BaseShape.GeometryLibrary = GeometryLibrary.Managed;
            Map1.MapUnit = GeographyUnit.DecimalDegree;
            ShapeFileFeatureLayer layer = new ShapeFileFeatureLayer(@"..\..\SampleData\Data\rail100k.shp");
            layer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoPen(GeoColor.SimpleColors.BrightOrange));
            layer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = new LineStyle(new GeoPen(GeoColor.SimpleColors.Copper));
            layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            layer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = new TextStyle("FNODE_", new GeoFont("Arial", 10f), new GeoSolidBrush(GeoColor.SimpleColors.DarkBlue));
            layer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle.OverlappingRule = LabelOverlappingRule.AllowOverlapping;
            layer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle.AllowLineCarriage = true;
            layer.IsVisible = false;

            layer.Open();
            RectangleShape rect = layer.GetBoundingBox();
            layer.Close();

            LayerOverlay overlay = new LayerOverlay();
            overlay.LockLayerMode = LockLayerMode.DoNotLock;
            overlay.Layers.Add(layer);
            Map1.CurrentExtent = rect;
            Map1.Overlays.Add(overlay);
            //WorldMapKitWmsWpfOverlay worldOverlay = new WorldMapKitWmsWpfOverlay();
            //Map1.Overlays.Add("WMK", worldOverlay);
            Map1.Refresh();



 
 
Btw, can you make a demo for the issues mentioned above? It will make us easy to debug it.
Thanks,
Johnny

Johnny,


Thanks for getting back to me.


There's a little confusion on where I am with this now so let me explain.


My issue with MyTextStyle causing an exception has been fixed with adding the 'Serialization' keyword to the class.  MyTextStyle now works just fine.


My issue now, as I stated in my prior post, is with the setting of the LockLayerMode property on the LayerOverlay to DoNotLock.


When DoNotLock is used then the setting of the IsVisible property, on any layer, is ineffective.  The layer(s) are always visible even if IsVisible is set to false.  The IsVisible Property will change its value when set, but the layer always remains visible.


To test this merely take your example code, set DoNotLock, and then add a button to your form that toggles the IsVisible Property of the layer.  You should see the layer always remain visible.


Regards,


Dennis


 




 Hi  Dennis,


Sorry for the misunderstanding. I guess the problem should be caused by missing call the "refresh()" method. After we changed some properties of the overlay, it doesn't take effect immediately until we called "Refresh()" method.  Following is a demo code, please check it out:


 

            (Map1.Overlays[0] as LayerOverlay).Layers[0].IsVisible = false;
            (Map1.Overlays[0] as LayerOverlay).Refresh();



Thanks,


Johnny





Johnny,


Thanks very much for those few lines of code as thay have solved the issue.


Up to this point I have only been invoking a Refresh at the map level and not the overlay level.  I will change my application to make use of the LayerOverlay.Refresh.  I would imagine this might also be more efficient.


Like everyone I am looking for my application to be as fast as possible and being able to set DoNotLock is a great step in that direction.


Thanks,


Dennis


 


 



You are so welcome. Dennis, we will keep on doing more enhancements to the performance in future. Please feel free to let us know if you have any problems. 
  
 Regards. 
 Johnny