gpt4 book ai didi

c# - 可移植类库 : recommended replacement for [Serializable]

转载 作者:IT王子 更新时间:2023-10-29 03:54:50 24 4
gpt4 key购买 nike

我正在将 .NET Framework C# 类库移植到可移植类库。一个反复出现的问题是如何处理用 [Serializable] 属性修饰的类,因为该属性不是可移植类库子集的一部分。可移植类库子集中的序列化功能似乎包含在 DataContractAttribute 中.

  • 为了在可移植类库中保留尽可能多的功能,将 [Serializable] 替换为 [DataContract] 属性是否足够(暗示所有需要序列化的字段和属性也需要用 [DataMember] 装饰)?
  • 使用这种我可以做的方法,我不能做什么(如果有的话)应用了[Serializable]
  • 是否有侵入性较小的方法?

鉴于使用了 [DataContract][DataMember],我正在考虑按照以下几行更改代码。这种方法有什么明显的缺陷吗?有什么方法可以更简洁地表述同样的事情吗?

#if PORTABLE
[DataContract]
#else
[Serializable]
#endif
public class SerializableClass : SerializableBaseClass
{
...
#if !PORTABLE
protected SerializableClass(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
#endif
...
#if PORTABLE
[DataMember]
#endif
private Type1 _serializableField;

#if PORTABLE
[DataMember]
#endif
private Type2 SerializableProperty { get; set; }

...
}

最佳答案

可移植类库 (PCL) 现已正式弃用 [2017 年 8 月 16 日]

If you’re sharing code between different .NET implementations today, you’re probably aware of Portable Class Libraries (PCLs). With the release of .NET Standard 2.0, we’re now officially deprecating PCLs and you should move your projects to .NET Standard.

来源: Announcing .NET Standard 2.0

可移植类库 (PCL) 现在可在所有平台上使用 [2013 年 10 月 14 日]

Prior to today’s release, there was a license restriction with the PCL reference assemblies which meant they could only be used on Windows. With today’s release we are announcing a new standalone release of the PCL reference assemblies with a license that allows it to be used on any platform – including non-Microsoft ones. This enables developers even more flexibility and to do great things with .NET.

来源: Portable Class Library (PCL) now available on all platforms

下载: Microsoft .NET Portable Library Reference Assemblies 4.6 RC

仅供引用,允许的程序集集是:

mscorlib.dll

System.dll

System.Core.dll

System.Xml.dll

System.ComponentModel.Composition.dll (MEF)

System.Net.dll

System.Runtime.Serialization.dll

System.ServiceModel.dll

System.Xml.Serialization.dll

System.Windows.dll (from Silverlight)

据我所知,您需要使用 DataMember 属性标记字段,并添加 DataContract 属性。

更新

是的。

你可以看看如何Json.NET实现了可移植类库解决方案。当您从这里下载项目时,您可以在 Source\Src\Newtonsoft.Json.Portable 中找到解决方案 Json.NET 4.5 Release 10 (source + binary) .

基本上他们使用自定义属性提供程序的方法

//不要使用Serializable

#if !(SILVERLIGHT || WINDOWS_PHONE || NETFX_CORE || PORTABLE)
[Serializable]
#endif

//使用自定义提供者

#if NETFX_CORE || PORTABLE
using ICustomAttributeProvider = Newtonsoft.Json.Utilities.CustomAttributeProvider;
#endif

如果项目是PORTABLE

#if !PocketPC && !NET20
DataContractAttribute dataContractAttribute = GetDataContractAttribute(objectType);
if (dataContractAttribute != null)
return MemberSerialization.OptIn;
#endif

OptIn 描述是:

 /// <summary>
/// Only members must be marked with <see cref="JsonPropertyAttribute"/> or <see cref="DataMemberAttribute"/> are serialized.
/// This member serialization mode can also be set by marking the class with <see cref="DataContractAttribute"/>.
/// </summary>
OptIn,

希望对您有所帮助。

更新 2

Am I losing any abilities using [DataContract] instead of [Serializable], or will I still be able to do everything that [Serializable] supports?

您可以执行 Serializable 支持的所有操作,除了在设置名称和顺序之外控制对象的序列化方式。

使用 DataContractSerializer有几个好处:

序列化任何用 [DataMember] 装饰的东西,即使它不是公开可见的

不能序列化任何东西,除非你特别告诉它 ("opt-in")

您可以使用 [DataMember] 上的 [Order=] 属性定义元素序列化的顺序

反序列化不需要无参数构造函数

比 XmlSerializer 快 10%。

在这里阅读更多:XmlSerializer vs DataContractSerializer

另供引用:

DataContract 默认支持以下几种类型的序列化:CLR 内置类型

Byte array, DateTime, TimeSpan, GUID, Uri, XmlQualifiedName, XmlElement and XmlNode array

Enums

Types marked with DataContract or CollectionDataContract attribute

Types that implement IXmlSerializable

Arrays and Collection classes including List, Dictionary and Hashtable

Types marked with Serializable attribute including those that implement ISerializable

Types with none of the above attributes (POCO) but with a default constructor

关于c# - 可移植类库 : recommended replacement for [Serializable],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12903262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com