C#可移植类库

时间:2016-02-09 11:42:20

标签: c# .net json serialization json.net

我目前正在将代码移植到PCL(Key通过Xamarin定位.NET 4.5 + mobile),并且遇到了一个熟悉的问题,即从非可序列化依赖项派生的类的序列化。我在DataContractJsonSerializer中使用了DataContract / Member属性,因此,在这个场景的非可移植版本中,我使用了IDataContractSurrogate来有效地交换掉那些无法针对自定义的类进行分类的类。 PCL中不存在IDataContractSurrogate,而DataContractJsonSerializer在逻辑上似乎是简化版本。

这里真正的问题是: 什么是IDataContractSurrogate的便携式等价物?

我到目前为止看过:

[On(De)Serializing]属性返回代理类,但不认为这实际上是这些属性的工作方式,绝对不是它们的设计目的。

SerializationBinder 但PCL兼容的DataContractJsonSerializer似乎没有接受“此功能仅在使用BinaryFormatter或NetDataContractSerializer时可用。”

DataContractResolver 似乎是最好的选择,但它不包含在DataContractJsonSerializer设置的任何位置。

来自JSON.NET的

JsonCreationConverter / [JsonConverter] 看起来像是可行的选项,但会阻止我在未来的迭代中交换序列化格式(即JSON非常适合调试,但我可能想切换到Binary以后,如果可能的话。)

列出这些选项似乎问题是不同的.NET序列化程序有不同的要求,因此他们自己解决这个问题的方法意味着我希望保持格式选项打开可能是不合理的。我将更深入地研究 DataContractSerializerOperationBehavior ,但如果有一个不那么复杂的替代方案,我将不仅仅是可以接受的。

提前致谢,

1 个答案:

答案 0 :(得分:1)

不幸的是,似乎没有这个PCL版本。但是,.NET Standard是PCL的下一种形式,似乎有一个包含ISerializationSurrogateProvider接口的.NET Standard 1.3库:

public interface ISerializationSurrogateProvider
{
    Type GetSurrogateType(Type type);

    object GetObjectToSerialize(object obj, Type targetType);

    object GetDeserializedObject(object obj, Type targetType);
}

这可以在System.Runtime.Serialization.Primitives包中找到,可以通过将System.Runtime.Serialization.Xml包添加到NuGet 3.4+项目来安装。此包引用并包含Primitives包作为依赖项。

此外,似乎还有另一个“私有”包System.Private.DataContractSerialization,其中包含一个带有两个DataContractSerializer扩展方法的类,用于修改此类的现在内部属性:

namespace System.Runtime.Serialization
{
  public static class DataContractSerializerExtensions
  {
    public static ISerializationSurrogateProvider GetSerializationSurrogateProvider(this DataContractSerializer serializer)
    {
      return serializer.SerializationSurrogateProvider;
    }

    public static void SetSerializationSurrogateProvider(this DataContractSerializer serializer, ISerializationSurrogateProvider provider)
    {
      serializer.SerializationSurrogateProvider = provider;
    }
  }
}

因此,虽然PCL支持似乎缺乏对此功能的支持,但.NET Standard支持仍然存在,应该只会改进。