我目前正在将代码移植到 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/