Friday 4 December 2015

Serialization of .NET classes into JSON object in C#.Net ?

What is Serialization  ?

Serialization is a programming technique that converts an object in memory to a sequence of bytes. The serialized data is suitable for storage in files and databases, and can be sent to other computer systems across network protocols.

you will see how to use features built-in to the .NET framework to serialize objects to JavaScript object notation (JSON). JSON stores objects and collections of objects in a human-readable, structured text format, and is commonly used in client/server architectures because of its high level of compatibility across a wide range of client programming languages.

.NET Framework Classes

In version 3.5 (and in later versions) of the .NET framework, classes for serializing and deserializing to JSON are included in the framework. The main classes you will use are in System.Runtime.Serialization and System.Runtime.Serialization.Json.

The general process for serializing and deserializing JSON from C# is:


  • Add a reference to the System.Runtime.Serialization library.
  • Add using directives for System.Runtime.Serialization and System.Runtime.Serialization.Json.
  • Define classes for the objects represented using DataContract and DataMember attributes.
  • Create an instance of DataContractJsonSerializer.
  • Use WriteObject() to serialize an object to a stream.
  • Use ReadObject() to deserialize an object from a JSON stream.



Classes and Service Contracts

DataContracts are agreements between clients and servers that describe the information that is to be exchanged between them. Windows Communication Foundation (WCF) uses these extensively, however, you only need a small familiarity with them to use the DataContractJsonSerializer.


The DataContract attribute is used to mark a class as suitable for serialization/deserialization by the DataContractJsonSerializer. The example below defines a class with the minimum attributes needed to work with the serializer.



The attribute DataMember can also be used to control certain elements in the serialization and deserialization process. It has five properties:


Property Name


  1. EmitDefaultValue:- Sets whether or not to serialize the default values for the fields and properties being serialized.
  2. IsRequired:-  Whether the member must be present in the JSON code when deserializing.
  3. Name :- The name of the member when serialized.
  4. Order:- The order of the serialization or  deserialization.
  5. TypeId :-  With derived classes, TypeId is a unique  identifier for this attribute.
Attribute properties are included in the DataMember attribute by specifying the property name and value in parenthesis as shown in this modified version of the UserReg class.




[DataContract]
    class UserReg
    {
        [DataMember(IsRequired = true)]
        public String FirstName;

        [DataMember]
        public String LastName;

        [DataMember(IsRequired = true)]
        public String Gender;

        [DataMember(Name = "EmailAddress", IsRequired = true)]
        public String EmailID;

        [DataMember(IsRequired = true)]
        public String MobileNo;

        [DataMember]
        public String Country;

        [DataMember]
        public String State;

        [DataMember]
        public String City;

        [DataMember]
        public String Address;

        [DataMember]
        public int PinCode;
    }




The example above uses the name property to change how the member EmailID appears in the serialized output. It also marks all members, apart from icon, as required.

Specifying the attribute properties can be useful when building a contract to an existing service that uses names that cannot be used in your class. When serialized,


Serialization with the DataContractJsonSerializer

To serialize a .NET object to JSON, you must create an instance of DataContractJsonSerializer. The constructor for this class has one parameter: a reference to the type of .NET object that is to be serialized or deserialized.

Use the method WriteObject() to perform the serialization and send the output to the specified stream. It can work with most streams that are derived from System.IO.Stream – such as file streams, memory streams, and network streams.



class TestSerialization
    {
        static void Main(string[] args)
        {
            UserReg userReg = new UserReg()
            {
                FirstName = "Rampal",
                LastName = "Singh",
                Gender = "Male",
                EmailID = "rampal.singh0586@gmail.com",
                MobileNo = "8861447949",
                Country = "India",
                State = "Uttar Pradesh",
                City = "Moradbad",
                Address = "Prakash Nagar",
                PinCode = 244255
            };

            DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(UserReg));
            MemoryStream ms = new MemoryStream();
            js.WriteObject(ms, userReg);

            Console.WriteLine("\r\nSerializing of .NET Class into JSON Object in C#\r\n");
            ms.Position = 0;
            StreamReader sr = new StreamReader(ms);
            Console.WriteLine(sr.ReadToEnd());
            sr.Close();
            ms.Close();
            Console.ReadKey();

        }
    }




The code above produces the following JSON output:
















Deserialization with the DataContractJsonSerializer

Deserialization takes JSON-formatted data and converts it into a .NET object in memory. As with serialization, this relies on using an instance of DataContractJsonSerializer. Generally speaking, you will be loading JSON data from a stream (most likely a network stream from communicating with a web server), however, in this example the JSON is hardcoded into a string and then accessed through a MemoryStream.

To deserialize JSON from a stream, use the method ReadObject(). This returns an Object type that you can cast to the desired class.


class TestSerialization
    {
        static void Main(string[] args)
        {

String userData = "{ \"FirstName\": \"Rampal\", \"LastName\": \"Singh\", \"Gender\": \"Male\", \"EmailAddress\": \"rampal.singh0586@gmail.com\", \"MobileNo\": \"8861447949\", \"Country\": \"India\", \"State\": \"Uttar Pradesh\" , \"City\": \"Moradabad\" , \"Address\": \"Prakash Nagar\", \"PinCode\": \"244255\"}";

            DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(UserReg));
            MemoryStream ms = new MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes(userData));

            UserReg userreg = (UserReg)js.ReadObject(ms);
            Console.WriteLine("\r\nDeserializing JSON object into .NET class Object in C#\r\n");
            Console.WriteLine("User Name: " + userreg.FirstName + "' '" + userreg.LastName);
            Console.WriteLine("Address: " + userreg.Address);
            ms.Close();

            Console.ReadKey();
       }
  }


Output Result:-
















In the above post I explain with example how to Serialization  the .NET classes into JSON objects and Deserialization back into .NET classes as objects. I hove this post very useful to you. I request you to please comments your feedback and questions here. Thamk Your

No comments:

Post a Comment