我目前正在将代码移植到 PCL(Key 通过 Xamarin 面向 .NET 4.5 + 移动设备(,并遇到了一个熟悉的问题,即从不可序列化依赖项派生的类的序列化。我将 DataContract/Member 属性与 DataContractJsonSerializer 一起使用,因此,在此方案的非可移植版本中,我使用 IDataContractSurrogate 有效地将无法分离的类换成可以分离的自定义类。IDataContractSurrogate在PCL中不存在,DataContractJsonSerializer在逻辑上似乎是一个简化版本。
这里真正的问题是:什么是IDataContractSurrogate的便携式等价物?
到目前为止,我已经看过:
[On(De(Serializing] 返回代理类的属性,但不认为这实际上是这些属性的工作方式,并且绝对不是它们的设计目的。
SerializationBinder,但这似乎不被PCL兼容的DataContractJsonSerializer接受 "此功能仅在使用BinaryFormatter或NetDataContractSerializer时可用"。
DataContractResolver 似乎是最佳选择,但它不包含在 DataContractJsonSerializer 设置中的任何位置。
JsonCreationConverter/[JsonConverter] 来自 JSON.NET 这似乎是可行的选择,但会阻止我在未来的迭代中交换序列化格式(即 JSON 非常适合调试,但我可能想稍后切换到二进制,如果可能的话(。
列出这些选项后,问题似乎是不同的.NET序列化程序有不同的要求,因此它们自己解决此问题的方法意味着我希望保持格式选项打开可能是不合理的。我将深入研究DataContractSerializerOperationBehavior,但如果有一个不太复杂的替代方案,我会非常容易接受。
提前感谢,
不幸的是,似乎没有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 标准支持存在,并且应该只会在未来改进。