StrataFrame Forum

SerializeToStream function

http://forum.strataframe.net/Topic98.aspx

By Daniel Essin - 11/23/2005

Using this code:

MemoryStream myStream = new MemoryStream();

boAllUsers1.NewRow();

boAllUsers1.SerializeToStream(myStream);

myStream.Position = 0;

BOLibrary.boAllUsers allUsers = (BOLibrary.boAllUsers)BusinessLayer.DeserializeBusinessObject(myStream);



1) {"Type 'BOLibrary.boAllUsers' in Assembly 'BOLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable."}



Is this something that we are supposed to have to address manually for each BO or should the code generator mark them all as [Serializable]?



2) The SerializeToStream method should set the Position to 0 before returning. Otherwise you get an "End of Stream reached unexpectedly" exception on the DeserializeBusinessObject call.



3) After addressing 1 and 2 the following exception is thrown:

{"The constructor to deserialize an object of type 'BOLibrary.boAllUsers' was not found."}


By StrataFrame Team - 11/23/2005

Yes, the [Serializable()] attribute must be added to the business objects before they can be serialized... we modified the StrataFrame Business Object template to have the attribute as well as the constructor needed to deserialize the business object. So, your current business objects will need to be modified, but any business objects you create here on out will automatically support it. So, easiest way to fix your current business objects is to add a new one using the template and copy the code out that is needed for the serialization (the [Serializable()] attribute on the class definition and the "Constructors" region in the main code file.



NOTE: the constructors have been pulled from the designer file and added to the main code file. Many users were worried that they could not modify any of the code within the designer file. (You can modify anything within the "Component Implementation" region and your changes won't be overriden.)
By StrataFrame Team - 11/23/2005

On the resetting the position of the stream to 0, we're not going to modify any portion of the stream after we write the business object to it, because it might not be the only object on the stream (you can write several business objects to the same stream, and setting the position to 0 after each one would cause them to overwrite each other). Additionally, you cannot modify the position manually on all streams, (the System.Security.Cryptography.CryptoStream and System.Net.NetworkStream come to mind) and trying to set it would throw an exception on these streams. It's better to let the developer manage his own stream position than modify it without his knowledge.
By Daniel Essin - 11/23/2005

Thank you. Everything seems to be working as you described.



I have a residual problem with this little sample that I am working on:



The table schema looks like this:

new DataColumn("ID", typeof(System.String)),





In my code:

boAllUsers1.NewRow();

boAllUsers1.ID = "FRED";



throws the following exception:

{"Input string was not in a correct format.Couldn't store in ID Column. Expected type is Int32."}



and if you use the visualizer to look at the underlying DataTable, it shows a -1 in the ID column.



All of the generated code seems to know that this column is a string column but the datatable thinks it's an int.



This has me stumped.
By Daniel Essin - 11/23/2005

On the position resetting issue, your logic is inescapable. It also answers my other question about where to create a new stream.



Thank you.