Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Web API - Dynamic to XML serialization

I am writing a Web API web service that is returning dynamically constructed property bag. Is there any working serializer or a way how to serialize dynamic to XML? I tried to look for any good suggestions but haven't found anything usable.

like image 314
Jakub Holovsky Avatar asked Sep 23 '13 03:09

Jakub Holovsky


People also ask

Is a Namespsace for XML serialization?

Xml. Serialization namespace contains several Attribute classes that can be applied to members of a class. For example, if a class contains a member that will be serialized as an XML element, you can apply the XmlElementAttribute attribute to the member.

What is the correct way of using XML serialization?

As with the CreatePo method, you must first construct an XmlSerializer, passing the type of class to be deserialized to the constructor. Also, a FileStream is required to read the XML document. To deserialize the objects, call the Deserialize method with the FileStream as an argument.

What is the basic difference between SOAP serialization and XML serialization?

- SoapFormatter is better to serialize arbitrary data. - XML Serialization would just serialize the public properties of an object. - The XML Serializer is used typically for serializing simple types across web services. - Xmlserializer is better, more flexible and faster.

Is XML a serialization format?

XML serialization is the process of converting XML data from its representation in the XQuery and XPath data model, which is the hierarchical format it has in a Db2® database, to the serialized string format that it has in an application.


1 Answers

We solved it by creating a custom XML formatter.

This isn't an ideal solution but it works.

In the Global.asax

GlobalConfiguration.Configuration.Formatters.Add(new CustomXmlFormatter());
GlobalConfiguration.Configuration.Formatters
    .Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

Create a new class called CustomXmlFormatter

using System;
using System.IO;
using System.Net.Http.Formatting;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace EMP.WebServices.api.Formatters
{
    public class CustomXmlFormatter : MediaTypeFormatter
    {
        public CustomXmlFormatter()
        {
            SupportedMediaTypes.Add(
                new MediaTypeHeaderValue("application/xml"));
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/xml"));
        }

        public override bool CanReadType(Type type)
        {
            if (type == (Type)null)
                throw new ArgumentNullException("type");

            return true;
        }

        public override bool CanWriteType(Type type)
        {
            return true;
        }

        public override Task WriteToStreamAsync(Type type, object value,
            Stream writeStream, System.Net.Http.HttpContent content,
            System.Net.TransportContext transportContext)
        {
            return Task.Factory.StartNew(() =>
                {
                        var json = JsonConvert.SerializeObject(value);

                        var xml = JsonConvert
                            .DeserializeXmlNode("{\"Root\":" + json + "}", "");

                        xml.Save(writeStream);
                });
        }
    }
}
like image 65
Jakub Holovsky Avatar answered Oct 21 '22 05:10

Jakub Holovsky