How to serialize an interface such as IList<T>
Solution 1
Change the
public IList<T> ListOfTs { get; set; }
to
public List<T> ListOfTs { get; set; }
Then it will work.
Solution 2
I think there's 2 ways that are generally approached for this kind of problem.
One would be to use DataContractSerializer, but since you're already using XmlSerializer, you probably don't want to do that.
The "alternative" is to have a property that is used specifically for the purpose of serialization, and to ignore the IList during serialization.
[Serializable]
public class S
{
IList<T> _listofTs;
[XmlIgnore]
public IList<T> ListOfTs { get _listofTs; set _listofTs = value; }
[XmlElement(Name="Not Exactly the Greatest Solution!")]
public List<T> ListOfTs { get _listofTs; set _listofTs = value; }
public S()
{
ListOfTs = new List<T>();
}
}
Related videos on Youtube
Dan Stevens
Programmer, musician, missionary and follower of Jesus Christ.
Updated on June 04, 2022Comments
-
Dan Stevens almost 2 years
Possible Duplicate:
How to serialize an IList<T>?I wish to serialize an class (let's call it
S
) that contains a property of the typeIList<T>
whereT
is another class which I have defined. I get an exception when I attempted to serialize an instance of classS
to XML. This is understandable as theXmlSerializer
doesn't know which concrete class to use. Is there a way, hopefully using attributes, to specify which concrete class to instantiate when serializing/deserializing an instance. My implementation of classS
creates a instance of theList<T>
class. Here is some code to illustrate my example:using System; using System.Xml.Serialization; using System.IO; [Serializable] public class T { } [Serializable] public class S { public IList<T> ListOfTs { get; set; } public S() { ListOfTs = new List<T>(); } } public class Program { public void Main() { S s = new S(); s.ListOfTs.Add(new T()); s.ListOfTs.Add(new T()); XmlSerializer serializer = new XmlSerializer(typeof(S)); serializer.Serialize(new StringWriter(), s); } }
I'm hoping there's an attribute I can place above the
ListOfTs
definition that says to the serialize, "assume an instance ofList<T>
when serializing/deserializing". -
Dan Stevens about 12 yearsI would do this, except this would change the interface for the
S
class. While this is unlikely to have practical impact, but from point of principle, I'd like to see if there's a way to solve the problem without changing the type. -
bashis over 8 yearsThe suggested solution, although is the working one, may ruin your public API architecture