loop
loop

Reputation: 9242

Serialize using DataContract Serializer

I have List of IProductDescription that i want to serialize in a valid xml using a DataContract Serializer. Such that i can deserialize it later. Here is ProductDescription class that implements IProductDescription interface.

[DataContract]
[KnownType(typeof(ProductDescription))]
public class ProductDescription : IProductDescription
{
    [DataMember]
    public List<AssetDescription> Assets { get; set; }

    [DataMember]
    public string ProductId { get; set; }

    [DataMember]
    public string Description { get; set; }

    [DataMember]  
    public string FormattedPrice { get; set; }

    [DataMember]
    public DateTime? ExpirationDate { get; set; }

    [DataMember]
    public ProductStatus ProductStatus { get; set; }

    [DataMember]
    public string ProductPageUrl { get; set; }

    [DataMember]
    public string PackageDownloadLocationUrl { get; set; }

}

Here is my AssetDescription Class

[DataContract]
public class AssetDescription
{
    [DataMember]
    public string Type { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Description { get; set; }

    [DataMember]
    public string IconUrl { get; set; }

}

Now i wanted serialize it. I already have an implementation of serialization. After reading here and there i got to know that i have to add some knowntype attribute but i am not getting successful. so can somebody help me in this problem.

Edit :- after adding attribute things are getting serialized but in wrong way like it top part of my serialized string.

<ArrayOfanyType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
  <anyType xmlns:d2p1="http://schemas.datacontract.org/2004/07/ProductDescriptionModel" i:type="d2p1:ProductDescription">
    <d2p1:Assets>

But when I deserilize it then it is throwing an exception that ArrayType should not be ArrayOfanyType

I want to serialize/desrialize the List of IProductDescription

Upvotes: 2

Views: 703

Answers (1)

Patrick Magee
Patrick Magee

Reputation: 2989

Try putting the KnownType in the serialiser.

void Main()
{
    var serializer = new DataContractSerializer(typeof(IProductDescription),  knownTypes: new[] { typeof(ProductDescription) });

    using(var writer = new XmlTextWriter("C:\\Temp\\test.xml", Encoding.UTF8))
    {
        serializer.WriteObject(writer, new ProductDescription());   
    }

    using(var reader = new XmlTextReader("C:\\Temp\\test.xml"))
    {
        var o = serializer.ReadObject(reader) as IProductDescription;

        Console.WriteLine(o.ToString());
    }
}

public enum ProductStatus { One, Two, Three }

public interface IProductDescription
{
    [DataMember]
    List<AssetDescription> Assets { get; set; }

    [DataMember]
    string ProductId { get; set; }

    [DataMember]
    string Description { get; set; }

    [DataMember]  
    string FormattedPrice { get; set; }

    [DataMember]
    DateTime? ExpirationDate { get; set; }

    [DataMember]
    ProductStatus ProductStatus { get; set; }

    [DataMember]
    string ProductPageUrl { get; set; }

    [DataMember]
    string PackageDownloadLocationUrl { get; set; }

}

[DataContract]
public class ProductDescription : IProductDescription
{
    [DataMember]
    public List<AssetDescription> Assets { get; set; }

    [DataMember]
    public string ProductId { get; set; }

    [DataMember]
    public string Description { get; set; }

    [DataMember]  
    public string FormattedPrice { get; set; }

    [DataMember]
    public DateTime? ExpirationDate { get; set; }

    [DataMember]
    public ProductStatus ProductStatus { get; set; }

    [DataMember]
    public string ProductPageUrl { get; set; }

    [DataMember]
    public string PackageDownloadLocationUrl { get; set; }

}

[DataContract]
public class AssetDescription
{
    [DataMember]
    public string Type { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Description { get; set; }

    [DataMember]
    public string IconUrl { get; set; }

}

Upvotes: 3

Related Questions