DarioSantarelli.Blog("UgiDotNet");

<sharing mode=”On” users=”*” />
posts - 176, comments - 105, trackbacks - 3

My Links

News


This is my personal blog. These postings are provided "AS IS" with no warranties, and confer no rights.




Tag Cloud

Archives

Post Categories

My English Blog

Serializzazione JSON con DataContractJsonSerializer

Una delle novità introdotte dal Framework 3.5 nell' ambito dello sviluppo in AJAX è l'introduzione della classe DataContractJsonSerializer, che di fatto sostituisce la classe JavaScriptSerializer (messa a disposizione dalle precedenti AJAX Extensions 1.0 per ASP.NET 2.0) nella serializzazione/deserializzazione di oggetti JSON. Utilizzando tali extensions la serializzazione/deserializzazione in/da una rappresentazione JSON poteva essere ottenuta in maniera molto semplice con un paio di righe di codice:

using System.Web.Script.Serialization;

Customer customer = new Customer() { Name = "Dario Santarelli", Address = "via Pippo 10", Email = "xxx@yyy.zz" };
JavaScriptSerializer javascriptSerializer = new JavaScriptSerializer();
Console.WriteLine(javascriptSerializer.Serialize(customer));   


Oggi invece l'introduzione della classe DataContractJsonSerializer rende obsoleto l'utilizzo del JavascriptSerializer, consigliando invece un' implementazione leggermente diversa dalla precedente. Ad esempio:

using System.Runtime.Serialization.Json;

Customer
customer = new Customer() { Name = "Dario Santarelli", Address = "via Pippo 10", Email = "xxx@yyy.zz" };
DataContractJsonSerializer serializer = new DataContractJsonSerializer(customer.GetType());
MemoryStream stream = new MemoryStream();
serializer.WriteObject(stream, customer);
string json = Encoding.UTF8.GetString(stream.ToArray());
Console.WriteLine(json);


Qual'è la differenza tra i due scenari? Per rispondere occorre addentrasi maggiormente nella questione.
Analogamente a quanto richiesto per utilizzo della classe JavaScriptSerializer, al fine di serializzare un oggetto in una stringa JSON tramite DataContractJsonSerializer dobbiamo anzitutto marcare la classe corrispondente come serializzabile. Abbiamo quindi due scelte: possiamo decorare la nostra classe Customer con l'attributo Serializable oppure con l'attributo DataContract (specificando ovviamente l'attributo DataMember per le proprietà di interesse).
Riassumendo, potremmo implementare la nostra classe Customer in due modi diversi, ottenendo però risultati di serializzazione diversi in base al tipo di Serializer scelto.

[Serializable]
public class Customer  
{
 
public string Name { get; set; }
 
public string Address { get; set; }
 
public string Email { get; set; }
}

Serializzazione JSON tramite DataContractJsonSerializer

{"<Address>k__BackingField":"via Pippo 10","<Email>k__BackingField":"xxx@yyy.zz",
"<Name>k__BackingField":"Dario Santarelli"}

Serializzazione JSON tramite JavaScriptSerializer:

{"Name":"Dario Santarelli","Address":"via Pippo 10","Email":"xxx@yyy.zz"}

[DataContract]
public class Customer
{
 
[DataMember(Name="FullName")]
 
public string Name { get; set; }

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

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


Serializzazione JSON tramite DataContractJsonSerializer:

{"Email":"xxx@yyy.zz","FullName":"Dario Santarelli","HomeAddress":"via Pippo 10" }

Serializzazione JSON tramite JavaScriptSerializer:

{"Name":"Dario Santarelli","Address":"via Pippo 10","Email":"xxx@yyy.zz"}

Da questo esempio vanno estrapolati due importanti aspetti:

  1. La serializzazione via DataContractJsonSerializer di un oggetto marcato come Serializable restituisce un output JSON in realtà non compatibile con il serializer client-side di ASP.NET AJAX.
  2. L'eventuale aliasing delle proprietà da serializzare tramite l'uso della proprietà Name dell'attributo DataMember si ripercuote nella generazione della corrispondente rappresentazione JSON da parte del DataContractJsonSerializer, a differenza di quanto accade con l'utilizzo del JavaScriptSerializer.
Technorati Tag: ,

Print | posted on Monday, September 22, 2008 11:27 PM | Filed Under [ ASP.NET 3.5 ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET