2012-06-27 27 views
0

我序列化包含名爲動態屬性字典的對象集合。Json.Net CustomSerialization

默認的Json發出如下所示:

[{"dynamicProperties":{"WatchId":7771,"Issues":0,"WatchType":"x","Location":"Equinix Source","Name":"PI_5570_5580"}}, 
{"dynamicProperties":{"WatchId":7769,"Issues":0,"WatchType":"x","Location":"Equinix Source","Name":"PI_5570_5574"}}, 
{"dynamicProperties":{"WatchId":7767,"Issues":0,"WatchType":"x","Location":"Equinix Source","Name":"PI_5570_5572"}}, 
{"dynamicProperties":{"WatchId":7765,"Issues":0,"WatchType":"y","Location":"Equinix Source","Name":"highlight_SM"}}, 
{"dynamicProperties":{"WatchId":8432,"Issues":0,"WatchType":"y","Location":"Test Devices","Name":"Cisco1700PI"}}] 

我想產生的JSON看起來像這樣:

[{"WatchId":7771,"Issues":0,"WatchType":"x","Location":"Equinix Source","Name":"PI_5570_5580"}, 
{"WatchId":7769,"Issues":0,"WatchType":"x","Location":"Equinix Source","Name":"PI_5570_5574"}, 
{"WatchId":7767,"Issues":0,"WatchType":"x","Location":"Equinix Source","Name":"PI_5570_5572"}, 
{"WatchId":7765,"Issues":0,"WatchType":"y","Location":"Equinix Source","Name":"highlight_SM"}, 
{"WatchId":8432,"Issues":0,"WatchType":"y","Location":"Test Devices","Name":"Cisco1700PI"}] 

從閱讀Json.Net文檔,它看起來像我可以爲我的班級建立一個CustomContractResolver,但我找不到有關如何去做這件事的任何細節......任何人都可以闡明我應該看到的方向嗎?

我試圖序列化的類如下所示。

我需要一個允許動態樣式行爲的類,它也可以通過WCF進行序列化和反序列化。

[DataContract] 
public class SerializableDynamicObject : IDynamicMetaObjectProvider 
{ 
    [DataMember] 
    private IDictionary<string, object> dynamicProperties = new Dictionary<string, object>(); 

    #region IDynamicMetaObjectProvider implementation 
    public DynamicMetaObject GetMetaObject(Expression expression) 
    { 
     return new SerializableDynamicMetaObject(expression, 
      BindingRestrictions.GetInstanceRestriction(expression, this), this); 
    } 
    #endregion 



    #region Helper methods for dynamic meta object support 
    internal object setValue(string name, object value) 
    { 
     dynamicProperties.Add(name, value); 
     return value; 
    } 

    internal object getValue(string name) 
    { 
     object value; 
     if (!dynamicProperties.TryGetValue(name, out value)) 
     { 
      value = null; 
     } 
     return value; 
    } 

    internal IEnumerable<string> getDynamicMemberNames() 
    { 
     return dynamicProperties.Keys; 
    } 
    #endregion 
} 
+1

你顯示你的序列化代碼? –

+0

已更新爲包含要序列化的類 – BonyT

回答

-1

實現了ISerializable

[DataContract] 
public class SerializableDynamicObject : IDynamicMetaObjectProvider, ISerializable 
{ 
    [DataMember] 
    private IDictionary<string, object> dynamicProperties = new Dictionary<string, object>(); 

    #region IDynamicMetaObjectProvider implementation 
    public DynamicMetaObject GetMetaObject(Expression expression) 
    { 
     return new SerializableDynamicMetaObject(expression, 
      BindingRestrictions.GetInstanceRestriction(expression, this), this); 
    } 
    #endregion 



    #region Helper methods for dynamic meta object support 
    internal object setValue(string name, object value) 
    { 
     dynamicProperties.Add(name, value); 
     return value; 
    } 

    internal object getValue(string name) 
    { 
     object value; 
     if (!dynamicProperties.TryGetValue(name, out value)) 
     { 
      value = null; 
     } 
     return value; 
    } 

    internal IEnumerable<string> getDynamicMemberNames() 
    { 
     return dynamicProperties.Keys; 
    } 
    #endregion 

    #region ISerializable Members 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     foreach (var key in dynamicProperties.Keys) 
     { 
      info.AddValue(key.ToString(), dynamicProperties[key]); 
     } 
    } 

    #endregion 
} 

現在測試在一個小控制檯應用程序的代碼...

static void Main(string[] args) 
    { 
     SerializableDynamicObject obj1 = new SerializableDynamicObject(); 
     obj1.setValue("WatchId", 7771); 
     obj1.setValue("Issues", 0); 
     obj1.setValue("Location", "sample location1"); 
     obj1.setValue("Name", "sample name 1"); 

     SerializableDynamicObject obj2 = new SerializableDynamicObject(); 
     obj2.setValue("WatchId", 7771); 
     obj2.setValue("Issues", 0); 
     obj2.setValue("Location", "sample location1"); 
     obj2.setValue("Name", "sample name 1"); 

     SerializableDynamicObject obj3 = new SerializableDynamicObject(); 
     obj3.setValue("WatchId", 7771); 
     obj3.setValue("Issues", 0); 
     obj3.setValue("Location", "sample location1"); 
     obj3.setValue("Name", "sample name 1"); 

     SerializableDynamicObject[] dictArray = new 
     SerializableDynamicObject[] { 
      obj1, obj2, obj3 
     }; 

     Newtonsoft.Json.JsonSerializer ser = new Newtonsoft.Json.JsonSerializer(); 
     ser.Serialize(Console.Out, dictArray); 
} 

這是程序的輸出:

[{」 WatchId「:7771,」Issues「:0,」Location「:」sample location1「,」Name「:」sample name 1「},{」WatchId「:7771,」Issues「:0,」Location「 locatio n2「,」Name「:」sample name 2「},{」WatchId「:7771,」Issues「:0,」Location「:」sample location3「,」Name「:」sample name3「}]

+0

我無法更改類的結構 - 我只需要控制它的序列化方式 – BonyT

+0

然後只需在SerializableDynamicObject的類聲明上實現ISerializable,就可以得到您需要的結果。 –

+0

這確實允許序列化工作,但它無法通過WCF發送反序列化。 – BonyT