Reputation: 9242
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
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