SerializationInfo
(1)
StreamingContext
(1)
DateTime
(1)
GetObjectData
(1)
GetDateTime
(1)
AddValue
(1)
GetValue
(1)
GetInt32
(1)

How can I add generic list to a serializable class?

Asked By mark4asp
01-Jun-07 07:55 AM
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.

How can I add generic list to a serializable class?

Asked By mark4asp
01-Jun-07 08:17 AM
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);
}
}

How can I add generic list to a serializable class?

Asked By Jon Skeet [C# MVP]
01-Jun-07 08:31 AM
Looks like you need typeof(List<int>).

I do not know whether that will work at runtime or not, but it will
compile...

Jon

Hi,Unless you class needs to make some custom serialization I would stick with

Asked By Ignacio Machin \( .NET/ C# MVP \)
01-Jun-07 09:59 AM
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.
How can I add generic list to a serializable class?
Asked By ktrvnbq0
01-Jun-07 10:21 AM
Additionally you would  need to typecast the return value from the
GetValue(...) call.

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