How can I add generic list to a serializable class?

M

mark4asp

I need to add an item to this class which I would like to be

public IncumbentManager List<int>;

(alternatively it may be an arraylist, but I prefer a List<int>)

This is the simplifed code below for the Class: ActivityData with just
two variables: ActivityID, ClosingDate.

How do I deal with this in the constructor?

SerializationInfo is a sealed class.

[Serializable()]
private class ActivityData : ISerializable
{
public int ActivityID = 0;
public List<int> IncumbentManager = null;
public DateTime ClosingDate = new DateTime(1753, 1, 1);

public ActivityData()
{
}
protected ActivityData(SerializationInfo info, StreamingContext
context)
{
ActivityID = info.GetInt32("ActivityID");
// What goes here?
// IncumbentManager = info.AddValue("IncumbentManager",
IncumbentManager, List<int>);
ClosingDate = info.GetDateTime("ClosingDate");
}

void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.FullTypeName = "Administration_MandateEdit+ActivityData";
info.AddValue("ActivityID", ActivityID);
// Is this correct?
info.AddValue("IncumbentManager", IncumbentManager);
info.AddValue("ClosingDate", ClosingDate);
}
}

PS: Not all ActivityData objects will have a value for
IncumbentManager.
 
M

mark4asp

I write this code (below) and I get a compilation error:

System.Collections.Generic.List<int>' is a 'type' but is used like a
'variable'

on this line: Incumbents = info.GetValue("Incumbents",
List<int>);

yet when I look at SerializationInfo I see this header:

public object GetValue(string name, Type type);



[Serializable()]
private class ActivityData : ISerializable
{
public int ActivityID = 0;
public List<int> Incumbents = null;
public DateTime ClosingDate = new DateTime(1753, 1, 1);

public ActivityData()
{
}
protected ActivityData(SerializationInfo info, StreamingContext
context)
{
ActivityID = info.GetInt32("ActivityID");
Incumbents = info.GetValue("Incumbents", List<int>);
ClosingDate = info.GetDateTime("ClosingDate");
}

void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.FullTypeName = "Administration_MandateEdit+ActivityData";
info.AddValue("ActivityID", ActivityID);
info.AddValue("Incumbents", Incumbents);
info.AddValue("ClosingDate", ClosingDate);
}
}
 
J

Jon Skeet [C# MVP]

I write this code (below) and I get a compilation error:

System.Collections.Generic.List<int>' is a 'type' but is used like a
'variable'

on this line: Incumbents = info.GetValue("Incumbents",
List<int>);

Looks like you need typeof(List<int>).

I don't know whether that will work at runtime or not, but it'll
compile...

Jon
 
I

Ignacio Machin \( .NET/ C# MVP \)

Hi,

Unless you class needs to make some custom serialization I would stick with
the provided mechanism.
List<int> is serializable so unless you have another members in your class
just decorate your class with [Serializable()]

The framework will take care of the case where the member is null for you.
 
K

ktrvnbq02

Looks like you need typeof(List<int>).

Additionally you'd need to typecast the return value from the
GetValue(...) call.

i.e. Incumbents = (List<int>) info.GetValue("Incumbents",
typeof(List<int>));
 

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