ThinkGeo.com    |     Documentation    |     Premium Support

Deserialized ShapeFileFeatureLayers missing Values

Hi,


I have been writing code to save my map project data to a serialized file.  While reading back serialized data from a ShapeFileFeatureLayer, the following errors occur:


 


UsingSpatialIndex = '((EMU.ShapeFeatureLayerSerializer)(shapeLayerData[0])).ShapeFileLayer.UsingSpatialIndex' threw an exception of type 'System.NullReferenceException'


Encoding = '((EMU.ShapeFeatureLayerSerializer)(shapeLayerData[0])).ShapeFileLayer.Encoding' threw an exception of type 'System.ArgumentNullException'


 


This is only happening to ShapeFileFeatureLayers as far as I can tell as I have been able to serialize/deserialize Overlays and TrackOverlays just fine.


My suspicion is that the serialized ShapeFileFeatureLayer is missing information about the SpatialIndex and the Encoding type when being written to disk.


I have tried modifying the Encoding value to both ASCII and Unicode and neither option allows for the deserialized data to be loaded.



Damian, 
  
 Thanks for your post, how are you doing your serialization?  Are you using the new GeoSerializer class included in the latest daily development build? 
  
 Can you post the code you are using to serialize/deserialize? 
  
 Thanks!

Hi Clint, 
  
 Sorry for the delayed reply.  I didn’t get any email post saying there were replies. 
  
 I am not using the GeoSerializer class.  To be honest, I didn’t know one existed.   
  
 Here is the serializing code I am using. 
  
     [Serializable] 
     class ShapeFeatureLayerSerializer 
     { 
         public string Version { get; set; } 
  
         public ShapeFileFeatureLayer ShapeFileLayer { get; set; } 
  
         public string OverlayName { get; set; } 
  
         // overloaded constructor sets members to parameter values 
         public ShapeFeatureLayerSerializer(string version, ShapeFileFeatureLayer shapeFileLayer, string overlayName) 
         { 
             Version = version; 
             ShapeFileLayer = shapeFileLayer; 
             OverlayName = overlayName; 
  
         } // end constructor 
     } 
  
 To save the serialized portion to file, I use this code. 
  
             LayerOverlay layerOverlay = ((LayerOverlay)winformsMap1.Overlays[“CultureOverlay”]); 
             foreach (ShapeFileFeatureLayer layer in layerOverlay.Layers) 
             { 
                 SerializationFunctions.WriteSerializedShapeFileOverlay(output, selectedVersion.ToString(), layer, layer.Name); 
             } 
  
 To Deserialize it and load it to the map, I run this code.  The shapeLayerData object contains the ShapeFileLayer, OverlayName and Version values in that order. 
  
                     Overlay myOverlay = winformsMap1.Overlays[“CultureOverlay”]; 
                     for (int i = 0; i < shapeFileCount; i++) 
                     { 
                         object[] shapeLayerData = SerializationFunctions.ReadSerializedShapeFileOverlay(input); 
  
                         ShapeFileFeatureLayer shapeLayer = (ShapeFileFeatureLayer)shapeLayerData[0]; 
                         string shapeLayerName = (string)shapeLayerData[1]; 
                         ((LayerOverlay)myOverlay).Layers.Add(shapeLayerName, shapeLayer); 
                         ((LayerOverlay)myOverlay).Layers[shapeLayerName].Name = shapeLayerName; 
                     } 
                     winformsMap1.Refresh(winformsMap1.Overlays[“CultureOverlay”]); 
  
 Thanks, 
 Damian

Hello Clint.   
  
 Is there any movement on this issue?  It’s actually holding up a release to my users.

Hello Damian, 
  
 I’m sorry for delay, I’m working on this now, I will post the result here as soon as possible. 
  
 Thanks for your patience. 
  
 Regards, 
  
 Gary

Thanks very much Gary.  I’ve been pulling my hair out on this one.

Hi Damian, 
  
 Thanks for your code, it looks the SerializationFunctions class is your custom class and could you let me know what you did in the function WriteSerializedShapeFileOverlay? 
  
 Are you using some Microsoft class like xmlserializer for serialize your ShapeFeatureLayerSerializer class? 
  
 In fact our shapelayer class contains some part which cannot be serialized correct by MS’s functions.  
  
 So could you download our latest code and try the GeoSerializer class? Our developer are working for that and keep fix issue of it.  
 This class will handle all serialize and deserialize things of our classes. 
  
 Please let us know if you met any problem when you are using that. 
  
 Regards, 
  
 Don 
  


Hi Don,


Thanks for the reply.


Here is the function for WriteSerializedShapeFileOverlay.  It's all using the BinaryFormatter.


public static void WriteSerializedShapeFileOverlay(FileStream output, string version, ShapeFileFeatureLayer shapeOverlay, string overlayName)

        {


            BinaryFormatter formatter = new BinaryFormatter();

 


            ShapeFeatureLayerSerializer shapeRecord = new ShapeFeatureLayerSerializer(version, shapeOverlay, overlayName);

            try

            {


                shapeRecord.ShapeFileLayer = shapeOverlay;

                shapeRecord.OverlayName = overlayName;


                // write Record to FileStream ( serialize object )

                formatter.Serialize(output, shapeRecord);


            }

            catch (SerializationException)

            {

                MessageBox.Show("Error Writing to File", "Error",

                    MessageBoxButtons.OK, MessageBoxIcon.Error);

            }

            // notify user if error occurs regarding parameter format

            catch (FormatException)

            {

                MessageBox.Show("Invalid Format", "Error",

                   MessageBoxButtons.OK, MessageBoxIcon.Error);

            } // end catch

        }


 


Does this new GeoSerializer class allow me to save basic information as well (like text parameters from forms)?  If not, then does that mean I have to save off a file for these data separately.  I did want to avoid having to save to multiple files.


I've just downloaded the project sample called Serialize to XML and I'm having some problem.  Basically, it comes up asking for a login to ap.thinkgeo.com which it rejects my normal login.  Then, when it switches to offline mode it doesn't see GeoSerializer class and hence won't compile.  I can't call this class from any other projects I have either.  Is there a reference I'm missing???  I've loaded in all dll for 5.5.0.38, so I don't know what is going on there.  I'm basically stuck until I can load it.  The API doesn't have anything for GeoSerializer class and the Serializer guide does not mention anything about a separate reference.


Based on the code sample, I am guessing I could just alter the above line from:


BinaryFormatter formatter = new BinaryFormatter();

to


GeoSerializer formatter = new GeoSerializer();

 


 


Regards,


Damian


 


 



Hi Damian,


Sorry I am not sure what's text parameters from forms. But you can use our GeoSerializer class serialize your ShapeFeatureLayerSerializer class. And you can added any information in it, our GeoSerializer will serialize that to one file. Please don't add control in it for example "Form" etc.


And for get it works well, you need download the latest development version from helpdesk system but not the latest release.



To be specific, you can get a revised version of Map Suite Web Edition that contains a fix for this bug by downloading the most recent Daily Build package from our Customer Portal. Once you do that, you'd just extract the DLLs from the daily build package and reference them in your project in place of your older DLLs.


Once you login to the Customer Portal, click on "My Product Downloads" and then click either the Daily Development Builds tab or the Daily Production Builds tab. The Daily Production Builds contain only bugfixes and are more stable (i.e., tested for production use). By comparison, the Daily Development Builds contain brand new features, some of which are beta or experimental, with stability not 100% guaranteed.


For more info about our daily build system, see this wiki article.



Regards,


Don



Don,


As mentioned before, I have already loaded in a version of the DLL that were said to contain the new GeoSerializer class.  Anyway, I have now uploaded the 5.5.0.55 from the Daily Production Builds and referenced them in my project.


As before, I see no type class for GeoSerializer.  Here is a screen shot from the sample application I downloaded from the support site.


I am sure I am missing something obvious here, but can't see what if I've got the most recent dll.


One further note is that I am using Desktop Edition and not Web Edition.  Not sure if that matters.


 


Regards,


Damian


 


 



Hi Damian, 
  
 I haven’t see your screen shot, could you upload that again? 
  
 And I think you need download the dll package under “Daily Development Builds” but not “Daily Production Builds”. 
  
 And the latest package is DesktopEditionFull5.5.56.0DllPackage.zip. 
  
 Infact the GeoSerializer class is in our core, so it’s not related with DesktopEdition or WebEdition. 
  
 Regards, 
  
 Don

Don, 
  
 I see now that the GeoSerializer is only available in the Development Builds.  I thought it was also in the Production Builds as I plan to deploy soon and did not want any stability issues.   
  
 I will try it now and see if I have any other questions on the implimentation. 
  
 Regards, 
 Damian

Damian,  
  
 Because we complete that after last release, I am sure that will be integrated to release in next version. 
  
 Please try that, and if you found any problem when you use it please let us know. 
  
 Regards, 
  
 Don