Asked by:
Is it possible to change namespace of the type when the object is deserialized in remoting?

Question
-
generally, the problem is after the files of the project are merged using ilmerge.
When the type is deserialized it cannot find the assembly in the current directory, in spite of the fact it resides in executable.
Initially I thought about SerializationBinder, but is it possible to apply it for remoting?
generally is it possible to change namespace on the fly?
Thanks!
- Moved by Alexander Sun Friday, May 18, 2012 9:21 AM Move to more appropriate forum (From:Visual C# General)
Saturday, May 12, 2012 10:40 PM
All replies
-
What type of remoting are you using? TCP, WCF or others?
What type of object you want to serializa and deserialize?
Do you have a segment of code?
chanmm
chanmm
Sunday, May 13, 2012 8:43 AM -
Well, it is standard .NET remoting.
I think it doesn't matter what type is serialized/deserialized as these are internal methods of the remoting when exchanging data over network.
Generally when data comes in, framework wants to find an assembly which has that type and is trying to load the assembly from the current directory. That file doesn't exists because had been merged using ilmerge and an exception is raised.
The stacktrace is:
Unhandled Exception: System.Runtime.Serialization.SerializationException: Unable
to find assembly 'X.X.X, Version=1.2.3.4, Culture=neutral, Publ
icKeyToken=null'.
Server stack trace:
at System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssem
bly()
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(Binary
AssemblyInfo assemblyInfo, String name)
at System.Runtime.Serialization.Formatters.Binary.ObjectMap..ctor(String obje
ctName, String[] memberNames, BinaryTypeEnum[] binaryTypeEnumA, Object[] typeInf
ormationA, Int32[] memberAssemIds, ObjectReader objectReader, Int32 objectId, Bi
naryAssemblyInfo assemblyInfo, SizedArray assemIdToAssemblyTable)
at System.Runtime.Serialization.Formatters.Binary.ObjectMap.Create(String nam
e, String[] memberNames, BinaryTypeEnum[] binaryTypeEnumA, Object[] typeInformat
ionA, Int32[] memberAssemIds, ObjectReader objectReader, Int32 objectId, BinaryA
ssemblyInfo assemblyInfo, SizedArray assemIdToAssemblyTable)
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWi
thMapTyped(BinaryObjectWithMapTyped record)
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWi
thMapTyped(BinaryHeaderEnum binaryHeaderEnum)
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(He
aderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAp
pDomain, IMethodCallMessage methodCallMessage)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize
(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCr
ossAppDomain, IMethodCallMessage methodCallMessage)
at System.Runtime.Remoting.Channels.CoreChannel.DeserializeBinaryResponseMess
age(Stream inputStream, IMethodCallMessage reqMsg, Boolean bStrictBinding)
at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.DeserializeMess
age(IMethodCallMessage mcm, ITransportHeaders headers, Stream stream)
at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMess
age(IMessage msg)Generally I am looking for the way to map namespaces of the target object to the executable namespace...
Sunday, May 13, 2012 9:07 AM -
I think it doesn't matter what type is serialized/deserialized as these are internal methods of the remoting when exchanging data over network.
Hi,
you could use a SerialzationBinder to change the AssemblyName and/or TypeName when deserializing.
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationbinder.aspx
Or, you could simply send the data as byte[] and construct the objects from constructors that uses this byte[] as parameter.
Regards,
Thorsten
Sunday, May 13, 2012 9:19 AM -
Right, but ... How Can I assign such mapping class to Binary Formatter of the Remoting?
Remoting when exchanges objects over network does it "in the box", I think I don't have an access to change it when deserializing occurs when object comes in? Do I?
Sunday, May 13, 2012 9:32 AM -
How do you serialize and deserialize the objects? Do you use a custom Formatter (that implements IRemotingFormatter)?
Regards,
Thorsten
Sunday, May 13, 2012 10:39 AM -
It is done out of my scope (.net remoting engine). I am not doing any serialize/deserialize operation explicitly.
Remoting is doing this, that is why I asked you if I can attach SerializationBinder to Remoting operations ...
Sunday, May 13, 2012 11:53 AM -
Why not keeping the assembly where the type is defined unmerged?Monday, May 14, 2012 12:48 AM
-
My goal is to have only one file: executable one ... and I am trying to do everything to make it working...
Would it be possible to change the destination type using custom Sink in remoting?
Monday, May 14, 2012 4:11 PM