user2264703
user2264703

Reputation: 523

Serialization error: there was an error reflecting type

I have two classes: ServiceTrigger and ServiceCalendar.

When I serialize model.Triggers I am getting an exception saying:

Cannot serialize member 'yyy.ServiceTrigger.ServiceDaysOfWeek' of type
'System.Collections.Generic.IEnumerable`1[[yyyy.ServiceCalendar, yyy.ChangeAD, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]',
see inner exception for more details."}

I have created an IEnumerable<ServiceTrigger>:

IEnumerable<ServiceTrigger> serviceTriggers = model.Triggers;
XDocument xDoc = SerializationUtil.Serialize(model.Triggers);

First Class is like this:

[DataContract]
public class ServiceTrigger
{   
    [DataMember(Name = "triggerID")]
    public long TriggerID { get; set; }

    [DataMember(Name = "name")]
    public string Name { get; set; }

    [DataMember(Name = "dateStart")]
    public string DateStart { get; set; }

    [DataMember(Name = "code")]
    public string Code { get; set; }

    [DataMember(Name = "isActive")]
    public bool IsActive { get; set; }

    [DataMember(Name = "dateFrom")]
    public string DateFrom { get; set; }

    [DataMember(Name = "dateTo")]
    public string DateTo { get; set; }  

    [DataMember(Name = "currentState")]
    public string CurrentState { get; set; }

    [DataMember(Name = "daysOfWeek")]
    public IEnumerable<ServiceCalendar> ServiceDaysOfWeek { get; set; } 

    [DataMember(Name = "monthsOfYear")]
    public IEnumerable<ServiceCalendar> MonthsOfYear { get; set; }

    [DataMember(Name = "daysOfMonth")]
    public IEnumerable<ServiceCalendar> DaysOfMonth { get; set; } 
}

Second Class is like this:

[DataContract]
public class Calendar
{
    [DataMember(Name = "id")]
    public int Id { get; set; }

    [DataMember(Name = "name")]
    public string Name { get; set; }

    [DataMember(Name = "code")]
    public string Code { get; set; }

    [DataMember(Name = "isActive")]
    public bool IsActive { get; set; }
)

My serialization class is like this:

public static class SerializationUtil
{
    public static T Deserialize<T>(XDocument doc)
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));

        using (var reader = doc.Root.CreateReader())
        {
            return (T)xmlSerializer.Deserialize(reader);
        }
    }

    public static XDocument Serialize(this object obj)
    {
        XmlSerializer xmlSerializer = new XmlSerializer(obj.GetType());

        XDocument doc = new XDocument();
        using (var writer = doc.CreateWriter())
        {
            xmlSerializer.Serialize(writer, obj);
        }

        return doc;
    }
}

Upvotes: 2

Views: 12187

Answers (1)

default
default

Reputation: 11635

You cannot serialize interfaces. You need to use actual objects, for instance List<ServiceCalendar>.

Also note that ServiceCalendar needs a default constructor without parameters in order for XmlSerializer to create it when deserializing. This is only important if you add a custom constructor with parameters. If you have no constructor at all, the default constructor is there already.

Example:

public class ServiceCalendar {
    // this is required for deserialization if a .ctor with parameters is present.
    public ServiceCalendar() { }

    public ServiceCalendar(int id) {
        this.id = id;
    }
}

Otherwise you will get an exception similar to

No parameterless constructor defined for type of ServiceCalendar

Upvotes: 4

Related Questions