Hello! I've just committed a patch that makes SarializationBinders to work with BinaryFormatter.
Lluis. ----- Original Message ----- From: "Lluis Sanchez" <[EMAIL PROTECTED]> To: "Ishpal Singh" <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]> Sent: Wednesday, February 19, 2003 12:25 AM Subject: Re: [Mono-list] problems with SerializationBinder > Hi, > > SerializationBinder support is not yet implemented in the BinaryFormatter. > I'll try to do it in the following days. It looks easy to do. > > Lluis. > > ----- Original Message ----- > From: "Ishpal Singh" <[EMAIL PROTECTED]> > To: <[EMAIL PROTECTED]> > Sent: Tuesday, February 18, 2003 11:39 PM > Subject: [Mono-list] problems with SerializationBinder > > > > Hi guys, > > > > A brief report reagrding the BinaryFormatter/Serialization which can be > > helpful to you guys. > > Thought I'd mail the bug (if I am not doing anything wrong :)). It might > > help a few. > > > > I am trying to work with the deserialization with mono. > > Passing a structure from a windows application running dotNet to the linux > > box running mono and try to recover the same object on the linux machine. > > It seems to transfer the data fine, but then it checks for the header of > the > > serialized structure and finds the assembly name in which the structure > was > > originally serialized. > > Now, since the two applications are different, the assembly names are also > > obviously different and so while deserializing it complains for the > assembly > > names. (refer http://msdn.microsoft.com/msdnmag/issues/02/09/net/ ) > > To work around I wrote another class called the > > 'AssmNameChangeDeserializationBinder'. The purpose of this binder is to > > replace the assembly name when it reaches the other application. > > It works fine if both the applications are on windows, but fails if one of > > the application is on MONO. MONO doesnt seem to invoke this class to > change > > the assembly name while deserializing. > > I think this needs to be fixed. > > > > ----------------------------------------------- > > using System; > > namespace cmsStruct > > { > > [Serializable()] > > public struct test > > { > > public int a; > > public string b; > > } > > } > > ----------------------------------------------- > > > > MemoryStream ms = new MemoryStream(b); > > BinaryFormatter bf1 = new BinaryFormatter(); > > ms.Position = 0; > > bf1.Binder = new AssmNameChangeDeserializationBinder(); > > > > cmsStruct.test t = (cmsStruct.test) bf1.Deserialize(ms); > > > > -------------------------------------------------------------------- > > > > sealed class AssmNameChangeDeserializationBinder : > > System.Runtime.Serialization.SerializationBinder > > { > > public override Type BindToType( string assemblyName, string typeName) > > { > > > > Console.WriteLine("in Bind to type..."); > > > > Type typeToDeserialize = null; > > > > // For each assemblyName/typeName that you wish to deserialize > > // to a different type, set typeToCreate to the desired type > > String assemVer1 = "TransferStructData, Version=1.0.0.0, " + > > "Culture=neutral, PublicKeyToken=b77a5c561934e089"; > > String typeVer1 = "cmsStruct.test"; > > > > Console.WriteLine("assemblyName={0}", assemblyName); > > > > if (assemblyName.IndexOf( "TransferStructData") != -1)// && typeName == > > typeVer1) > > { > > assemblyName = assemblyName.Replace("TransferStructData", > > "dotNetServer"); > > } > > > > // To return the type, do this: > > typeToDeserialize = Type.GetType(String.Format("{0}, {1}", > > typeName, assemblyName)); > > > > return typeToDeserialize; > > } > > } > > > > > > ------------------------------------------------------------------ > > > > WORAROUND TO GET IT GOING ON MONO > > --------------------------------- > > I had to change the name of the assembly while serializing the structure, > > after inheriting it from ISerializable as the following code shows. > > The code with following structure to transfer data works on both windows > and > > mono. > > And no need to use the Binder to chahge the name of the Assembly at the > time > > of deserialization. > > > > using System; > > using System.IO; > > using System.Runtime.Serialization; > > > > namespace cmsStruct > > { > > [Serializable()] > > public struct test : ISerializable > > { > > public int a; > > public string b; > > > > //Deserialization constructor. > > public test (SerializationInfo info, StreamingContext context) > > { > > a = (int)info.GetValue("a", typeof(int)); > > b = (String)info.GetValue("b", typeof(string)); > > } > > > > > > public void GetObjectData(SerializationInfo info, StreamingContext > > context) > > { > > info.AddValue("a", a); > > info.AddValue("b", b); > > info.AssemblyName = "dotNetServer"; > > } > > } > > } > > ------------------------------------- > > > > > > Please let me know incase someone needs some more information or if I am > > creating confusions. > > > > > > Best Regards, > > Ishpal Singh. > > > > System Analyst > > R&D > > Aeye Ltd > > > > Information contained in this email is confidential and is intended only > > for the recipient. (c) Aeye Ltd, Aeye.biz, 2003. > > > > _______________________________________________ > > Mono-list maillist - [EMAIL PROTECTED] > > http://lists.ximian.com/mailman/listinfo/mono-list > > > _______________________________________________ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list
