c# - C# 可移植类库中用于序列化的代理类型

标签 c# .net json serialization json.net

我目前正在将代码移植到 PCL(主要目标是 .NET 4.5 + 移动版,通过 Xamarin)并且遇到了一个熟悉的问题,即从不可序列化的依赖项派生的类的序列化。我将 DataContract/Member 属性与 DataContractJsonSerializer 一起使用,因此,在此方案的非可移植版本中,我使用 IDataContractSurrogate 有效地将无法序列化的类换成可以序列化的自定义类。 IDataContractSurrogate 在 PCL 中不存在,DataContractJsonSerializer 从逻辑上讲似乎是一个简化版本。

这里真正的问题是: 什么是 IDataContractSurrogate 的可移植等效项?

到目前为止我看过:

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

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

DataContractResolver 似乎是最佳选择,但它并未包含在 DataContractJsonSerializer 设置中的任何位置。

来自 JSON.NET 的

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

列出这些选项后,问题似乎在于不同的 .NET 序列化程序有不同的要求,因此它们有自己的解决此问题的方法,这意味着我希望将格式选项保持打开状态可能是不合理的。我将深入研究 DataContractSerializerOperationBehavior,但如果有更简单的替代方案,我会非常乐意接受。

提前致谢

最佳答案

不幸的是,似乎没有这个的 PCL 版本。然而,.NET Standard是 PCL 的下一种形式,似乎有一个包含 ISerializationSurrogateProvider 接口(interface)的 .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 包作为依赖项。

此外,似乎还有另一个“私有(private)”包,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 支持存在并且只会在未来得到改进。

关于c# - C# 可移植类库中用于序列化的代理类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35291181/

相关文章:

json - 用于 JSON 数据的 Jasper Reports 数据源

c# - 如何在图像上绘制带有轮廓的文本?

c# - 在 Mongodb C# 中使用 AsQueryable 进行过滤 - ExpandoObject

c# - 如何在 Linq 中运行批量更新/删除查询?

c# - 少量数据中的 NamedPipe 与 TCP/IP

php - 如何在php中使用blob图像获取所有数据库记录

c# - 如何使用 ExecuteNonQuery 在 VARCHAR(MAX) 列中插入超过 8000 个字符?

c# - 如何让 msbuild 在 vi​​sual studio 中部署任务?

c# - 处理 P/Invoking 时函数调用导致堆损坏的第 3 方库

c# - 如何将此 JSON 反序列化为对象?