2016-03-30 12 views
0

私はデータをシリアル化するためにIDataContractSurrogateを使用しましたが、CPL(portable class librairy)と互換性がないので、今はNewtonsoftを使用しています。キャストタイプNewtonsoft.Jsonと

しかし、私はリストにのObservableCollectionタイプをキャストする必要があります。myobj ["test1", "test2"],

myobj [ { id:1, name="test1", value="test_1"}, { id:2, name="test2", value="test_2"}] 

それは可能ですか? 私はこのようにしてみました:

public class ccrUser : DefaultContractResolver { // Newtonsoft.Json.Serialization.IContractResolver 

     private bool toSerialise; 
     public static readonly ccrUser Instance = new ccrUser(true); 

     /// <summary>Constructeur</summary> 
     /// <param name="pToSerialise">Indique le sens qui sera utlisé (les API ne donnent pas le même format en GET qu'elles attendent en POST).</param> 
     public ccrUser(bool pToSerialise) : base() { toSerialise = pToSerialise; } 

     protected override JsonContract CreateContract(Type objectType) { 
      var contract = base.CreateContract(objectType); 
      if ((toSerialise) && (objectType == typeof(ObservableCollection<tblGroup>))) { 
       //contract.Converter = new Newtonsoft.Json.Converters.CustomCreationConverter<string>(); 
       return base.CreateArrayContract(objectType); 
      } else 
       return contract; 
     } 
     protected override List<MemberInfo> GetSerializableMembers(Type objectType) { 
      var defaultMembers = base.GetSerializableMembers(objectType); 
      if ((toSerialise) && (objectType == typeof(ObservableCollection<tblGroup>))) { 
       return defaultMembers; 
      } else 
       return defaultMembers; 
     } 


     protected override JsonConverter ResolveContractConverter(Type objectType) { 
      if (objectType == typeof(ObservableCollection<tblGroup>)) { 
       return null; // pretend converter is not specified 
      } 
      return base.ResolveContractConverter(objectType); 
     } 

     /// <summary>JSON value provider that always returns a static value</summary> 
     public class StaticValueProvider : IValueProvider { 
      private readonly object _staticValue; 
      public StaticValueProvider(object staticValue) { _staticValue = staticValue; } 
      public void SetValue(object target, object value) { throw new NotSupportedException(); } 
      public object GetValue(object target) { return _staticValue; } 
     } 

     protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { 
      JsonProperty property = base.CreateProperty(member, memberSerialization); 
      if ((toSerialise) && (property.PropertyType == typeof(ObservableCollection<tblGroup>))) { 
      } 
      return property; 
     } 
    } 

解決方法が見つかりません。

よろしく

+0

あなたが必要とするものを返すための他の財産?または、問題が逆(シリアル化する)の場合は、元のものではなくタイプ変換を行う他のプロパティを直列化します。 – Sinatr

+0

名前の衝突のため。シリアライズでは、 "グループ"は文字列の配列であり、逆シリアル化では "グループ"はオブジェクトの配列である必要があります。 – david

答えて

0

代わりのシリアライズ/デシリアライズプロセス自体の間に鋳造ます(別のタイプの)別のプロパティをデシリアライズ/シリアライズすることができます

// serialize only marked members 
[JsonObject(MemberSerialization = MemberSerialization.OptIn)] 
public class SerializableObject 
{ 
    // original property: not serialized 
    public TypeA PropertyA { get; set; } 

    [JsonProperty(nameof(PropertyA))] 
    public TypeB PropertyB 
    { 
     get 
     { 
      // convert PropertyA value to TypeB 
      return (TypeB)PropertyA; 
     } 
     set 
     { 
      // convert TypeB to TypeA and set PropertyA value 
      PropertyA = (TypeA)value; 
     } 
    } 
} 

PropertyB(必要であればprivateすることができます)にのみ使用されますPropertyA値を別の型としてシリアル化/逆シリアル化します。

+0

これは動作しますが、私はそれがbeautufulないと思う。 [DataMemberプロパティ(名前= "グループ")] 公共のIEnumerable groupsApi { のget {リターン(_groups = nullで!)? (ObservableCollection のcから)_groups select c.value).ToList():null; } セット{_groups = new ObservableCollection (); value.ForEach((a)=> {_groups.Add((Newtonsoft.Json.Linq.JObject)a).ToObject ());}); } } 公開ObservableCollection groups {get {return _groups; } {_groups = value; }} – david

0

コンパイルエラーがあり、それはリスト<文字列を解析することはできません> IEnumerableを<にtblGroup>:

あなたはそのまま `myobj`をデシリアライズし、その後のゲッターで何かをしないのはなぜ
[DataMember(Name ="groups")] 
public List<string> groupsApi { get { return (from c in (ObservableCollection<tblGroup>)_groups select c.value).ToList(); } set { _groups = new ObservableCollection<tblGroup>(value); } } 
public ObservableCollection<tblGroup> groups { get { return _groups; } set { _groups = value; } } 
関連する問題