简体   繁体   中英

XML Serialize List of generic objects derived from an interface,,,

So I'm trying to XML serialize a List<IObject> derrived from an interface, but the IObjects are generic types... best resort to code:

public interface IOSCMethod
{
    string Name { get; }
    object Value { get; set; }
    Type Type { get; }
}

public class OSCMethod<T> : IOSCMethod
{
    public string Name { get; set; }
    public T Value { get; set; }
    public Type Type { get { return _type; } }

    protected string _name;
    protected Type _type;

    public OSCMethod() { }

    // Explicit implementation of IFormField.Value
    object IOSCMethod.Value
    {
        get { return this.Value; }
        set { this.Value = (T)value; }
    }
}

And I have a List of IOSCMethods:

List<IOSCMethod>

of which I add objects to in the following way:

        List<IOSCMethod> methodList = new List<IOSCMethod>();
        methodList.Add(new OSCMethod<float>() { Name = "/1/button1", Value = 0 });
        methodList.Add(new OSCMethod<float[]>() { Name = "/1/array1", Value = new float[10] });

And it's this methodList which is what I'm trying to serialize. But everytime I try, either I get a "Can't serialize an interface" but when I make it (either the IOSCMethod or the OSCMethod<T> class) implement IXmlSerializable I get the problem of "can't serialize an object with a parameterless constructor. but obviously I can't because it's an interface! lame pants.

Any thoughts?

Is this what you want:

[TestFixture]
public class SerializeOscTest
{
    [Test]
    public void SerializeEmpTest()
    {
        var oscMethods = new List<OscMethod>
                             {
                                  new OscMethod<float> {Value = 0f}, 
                                  new OscMethod<float[]> {Value = new float[] {10,0}}
                              };
        string xmlString = oscMethods.GetXmlString();
    }
}

public class OscMethod<T> : OscMethod
{
    public T Value { get; set; }
}

[XmlInclude(typeof(OscMethod<float>)),XmlInclude(typeof(OscMethod<float[]>))]
public abstract class OscMethod
{

}

public static class Extenstion
{
    public static string GetXmlString<T>(this T objectToSerialize)
    {
        XmlSerializer xmlSerializer = new XmlSerializer(objectToSerialize.GetType());
        StringBuilder stringBuilder = new StringBuilder();
        string xml;
        using (var xmlTextWriter = new XmlTextWriter(new StringWriter(stringBuilder)))
        {
            xmlSerializer.Serialize(xmlTextWriter, objectToSerialize);
            xml = stringBuilder.ToString();
        }
        return xml;
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM