views:

4846

answers:

7

I'm using an XmlSerializer to deserialize a particular type in mscorelib.dll

XmlSerializer ser = new XmlSerializer( typeof( [.Net type in System] ) );
return ([.Net type in System]) ser.Deserialize( new StringReader( xmlValue ) );

This throws a caught FileNotFoundException when the assembly is loaded:

"Could not load file or assembly 'mscorlib.XmlSerializers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified."

FusionLog:

=== Pre-bind state information ===
LOG: User = ###
LOG: DisplayName = mscorlib.XmlSerializers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86
 (Fully-specified)
LOG: Appbase = file:///C:/localdir
LOG: Initial PrivatePath = NULL
Calling assembly : System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\localdir\bin\Debug\appname.vshost.exe.Config
LOG: Using machine configuration file from c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Post-policy reference: mscorlib.XmlSerializers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86
LOG: Attempting download of new URL file:///C:/localdir/bin/Debug/mscorlib.XmlSerializers.DLL.
LOG: Attempting download of new URL file:///C:/localdir/bin/Debug/mscorlib.XmlSerializers/mscorlib.XmlSerializers.DLL.
LOG: Attempting download of new URL file:///C:/localdir/bin/Debug/mscorlib.XmlSerializers.EXE.
LOG: Attempting download of new URL file:///C:/localdir/bin/Debug/mscorlib.XmlSerializers/mscorlib.XmlSerializers.EXE.

As far as I know there is no mscorlib.XmlSerializers.DLL, I think the DLL name has bee auto generated by .Net looking for the serializer.

You have the option of creating a myApplication.XmlSerializers.DLL when compiling to optimise serializations, so I assume this is part of the framework's checking for it.

The problem is that this appears to be causing a delay in loading the application - it seems to hang for a few seconds at this point.

Any ideas how to avoid this or speed it up?

+1  A: 

The delay is because, having been unable to find the custom serializer dll, the system is building the equivalent code (which is very time-consuming) on the fly.

The way to avoid the delay is to have the system build the DLL, and make sure it's available to the .EXE - have you tried this?

Will Dean
A: 

Thanks @Will Dean, that's kinda what I figured, but it seems too slow even for that.

If it were my own assembly creating the serialisation assembly shouldn't be an issue, but how would I do that for mscorlib?

Keith
+1  A: 

I'm guessing now. but:

  1. The system might be generating a serializer for the whole of mscorlib, which could be very slow.
  2. You could probably avoid this by wrapping the system type in your own type and serialising that instead - then you'd get a serializer for your own assembly.
  3. You might be able to build the serializer for mscorlib with sgen.exe, which was the old way of building serializer dlls before it got integrated into VS.
Will Dean
A: 

Thanks again.

I think it is (1), but I can't do (2) as it's a struct. I'll try (3)

Keith
A: 

but I can't do (2) as it's a struct.

I know I'm being dim here, but what's the problem with it being a struct - obviously there may be some extra copying going on, but relative to the costs of xml serialisation it seems unlikely that's very significant.

What is the system.xx type anyway?

Will Dean
A: 

The type I'm dealing with is RSAParameters which is being used as part if some system cryptography stuff.

I've worked around this now by storing the encrypted key by another means and creating a new RSAParameters myself.

It seems like a relatively common thing to want to serialise (i.e. encryption/decryption keys).

Keith
A: 

Okay, so I ran into this problem and have found a solution for it specific to my area.

This occurred because I was trying to serialize a list into an XML document (file) without an XML root attribute. Once I added the following files, the error goes away.

XmlRootAttribute rootAttribute = new XmlRootAttribute(); rootAttribute.ElementName = "SomeRootName"; rootAttribute.IsNullable = true;

Dunno if it'll fix your problem, but it fixed mine.