Generics and their resulting class. Possible to obtain?

T

ThunderMusic

Hi,
We need to serialize (binary) objects containing generic collections. The
thing is, when we try to get the objects back (deserialize) with a different
instance of the application, we receive an exception stating the constructor
of the generic class does not exist. So Is there a way to obtain the
resulting classes of the generics we use so we can add them as "normal" code
in our app? We can develop our own starting from non-generic collections,
but then we would have to develop our own methods and maintain them. The
generics are already debuged and maintained by MS so we would like to
generate them with the same generator the framework generates them if
possible.

So if I summarize what we want : We want to take the resulting class from a
given generic and "copy-paste" the code and create a "user class" that we
will add to our project.

Is it possible?

Thanks

ThunderMusic
 
R

raylopez99

Hi,
We need to serialize (binary) objects containing generic collections. The
thing is, when we try to get the objects back (deserialize) with a different
instance of the application, we receive an exception stating the constructor
of the generic class does not exist.

So there's your starting point. Do you have a constructor for the
generic class?
So Is there a way to obtain the
resulting classes of the generics we use so we can add them as "normal" code
in our app?

What is "normal"?
We can develop our own starting from non-generic collections,
but then we would have to develop our own methods and maintain them. The
generics are already debuged and maintained by MS so we would like to
generate them with the same generator the framework generates them if
possible.

Nothing is as it seems. MS code is not bug free. A while ago, a guy
had a problem here because he was using a structure rather than a
class--and precisely because of this, he had a problem (mixing
structures with classes is like mixing trucks with automobiles--they
don't really mix. Avoid structures).
So if I summarize what we want : We want to take the resulting class from a
given generic and "copy-paste" the code and create a "user class" that we
will add to our project.

Is it possible?

No. Not as you described it. It might help to know what interface
you're using.

Good luck,

RL
 
T

ThunderMusic

hi,

ok... maybe I explained it wrong... let's take Dictionary<int, string>.
When I instanciate one of those, .NET generates on-the-fly a new class for
Dictionary<int, string> (or maybe it's at compile time, but the problem
stays the same for us because it's a web app, so it can be recompiled at any
time). If I serialize it, it works fine. If I deserialize it within the same
app instance, it works fine. If a new instance is started and I try to
deserialize it, then I get an exception stating there is no constructor for
Dictionary<int, string>.

So, what I want to know is if it is possible to get the resulting class (The
one .NET generates from Dictionary<int, string>) so we can take the code and
put it in a file in our project so the class always stays the exact same
class?

btw, I know MS code is not bug free, but if we can build on something that
was tested by thousands if not millions of users (developers), we go for it.

Thanks

ThunderMusic
 
J

Jon Skeet [C# MVP]

Nothing is as it seems. MS code is not bug free. A while ago, a guy
had a problem here because he was using a structure rather than a
class--and precisely because of this, he had a problem (mixing
structures with classes is like mixing trucks with automobiles--they
don't really mix. Avoid structures).

Structures and classes mix absolutely fine - you just need to know
what's going on. If you don't understand how each of them works, then
indeed you'll get problems.

Jon
 
G

GlennDoten

Jon said:
Structures and classes mix absolutely fine - you just need to know
what's going on. If you don't understand how each of them works, then
indeed you'll get problems.

Jon

I send that! Structs are indeed incredibly handy items. They are great
for abstracting something that you might normally pass around as (say)
an int. A lot of times I'll create a struct for some business
concept--like a SKU--instead of just passing around an int. This is
incredibly handy for a lot of reasons.

I'm not quite sure how you would "mix" structs and classes anyhow...
 
J

Jon Skeet [C# MVP]

I'm not quite sure how you would "mix" structs and classes anyhow...

I suspect Ray means in terms of putting a reference type variable as a
member of a struct. It's rarely useful, but it *does* work, and so
long as you understand what reference types and value types actually
do, there shouldn't be any surprises.

Jon
 
N

Nicholas Paldino [.NET/C# MVP]

ThunderMusic,

If you are serializing a Dictionary<int, string> to a byte stream, then
you should be able to recreate that instance in any instance of an app that
requires a Dictionary<int, string>. There should be no errors here.

Can you recreate the example? I've done it here with that type, and
have no problems serializing/deserializing a dictionary like that and then
recreating the instance in another run of the app.
 
R

Rene

We need to serialize (binary) objects containing generic collections. The
thing is, when we try to get the objects back (deserialize) with a
different instance of the application, we receive an exception stating the
constructor of the generic class does not exist.

Why is this happening? I am able to serialize (binary) a bunch of classes
into a file and then I am able to deserialize them at any time on different
instances of the application. Probably not the exact same thing you are
doing but equivalent.



What else do you have going on?
 
T

ThunderMusic

Thanks to everyone of you.
We finally found the problem. We read the exception stack wrong and thought
it was the actual System.Collections.Generics.Dictionary that was not
deserializable. The thing is, we made a custom Dictionary (that inherits
from Dictionary) that can be serialized in XML and it's called Dictionary
just the same, but in another namespace... The "Serialization" constructor
(the 7th constructor of Dictionary<>) was missing, so that's why we had this
exception. Now everything is back on track.

Thanks and sorry for the waste of time

ThunderMusic
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top