42

我正在將.NET Framework C#類庫移植到可移植類庫中。一個反覆出現的問題是如何處理用[Serializable]屬性修飾的類,因爲此屬性不是可移植類庫子集的一部分。可移植類庫子集中的序列化功能似乎覆蓋了DataContractAttribute可移植類庫:[Serializable]的推薦替換

  • 儘可能多地保留的移植類庫中的功能可能是它足以與[DataContract]屬性替換[Serializable](與暗示主題系列化的所有字段和屬性需要與[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; } 

     ... 
    } 

回答

42

便攜式類庫(PCLS)已正式棄用 [2017年8月16日]

如果」今天在不同的.NET實現之間共享代碼, 您可能知道可移植類庫(PCL)。使用.NET Standard 2.0的 版本,我們現在正式廢棄PCL ,您應該將項目移至.NET Standard。

來源:Announcing .NET Standard 2.0

便攜式類庫(PCL)現在在所有平臺上[二零一三年十月十四日]

此前今天的發佈,有許可限制使用這意味着它們只能在Windows上使用的PCL 引用程序集。 隨着今天的發佈,我們宣佈推出 PCL參考組件的新獨立版本,許可證允許它在 任何平臺(包括非微軟平臺)上使用這使得開發人員可以更靈活地使用.NET來完成偉大的事情。

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

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

只爲參考允許組組件有:

mscorlib.dll中

SYSTE m.dll

System.Core.dll

system.xml.dll的

System.ComponentModel.Composition.dll(MEF)

System.Net.dll

系統。 Runtime.Serialization.dll

System.ServiceModel.dll

System.Xml.Serialization.dll

System.Windows.dll中(Silverlight的)

據我知道你需要標記與數據成員屬性的字段,並添加DataContract屬性。

UPDATE

是。

您可以看看如何實施Json.NET便攜式類庫解決方案。當您從這裏下載項目Json.NET 4.5 Release 10 (source + binary)時,您可以在Source \ Src \ Newtonsoft.Json.Portable中找到解決方案。

基本上他們使用的方法與自定義屬性提供

//不要使用序列化

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

//使用自定義提供

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

如果項目是便攜式

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

其中選擇啓用介紹:

/// <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

我是不可能輸給任何能力使用[DataContract]代替 [可序列化],否則我將仍然能夠做到這一點 [Serializable接口]支持一切嗎?

你可以做到這一點Serializable接口支持除在對象是如何設置的名稱和順序之外連載 控制一切。

使用DataContractSerializer有幾個好處:

序列任何裝飾的[DataMember]即使它不是公共可見

不能序列任何東西,除非你明確告訴它(「選擇加入」)

可以定義在其中元件使用在[DataMember]

[Order=]屬性序列的順序

不需要用於反序列化的無參數構造函數

比XmlSerializer快10%。

在這裏閱讀更多:XmlSerializer vs DataContractSerializer

還在爲參考:

DataContract支持在默認模式下以下幾種類型的序列: CLR內建類型

字節數組,DateTime,TimeSpan,GUID,Uri,XmlQualifiedName, XmlElement和XmlNode數組

枚舉

類型標有DataContract或CollectionDataContract屬性

類型實現IXmlSerializable的

數組和集合類,包括列表,字典和 Hashtable的

類型標有Seri​​alizable屬性包括那些 實現ISerializable

沒有上述屬性的類型(POCO)bu t with default 構造函數

+1

我的主要關注點是; [DataContract]和[DataMember]的裝飾是否足以替代[Serializable]? –

+3

查看最新的答案。 –

+0

非常感謝您提供的信息更新,我將仔細研究JSON。我是否會失去使用[DataContract]而不是[Serializable]的能力,或者我仍然能夠完成[Serializable]支持的所有功能? –

10

有一兩件事你可以做些什麼來消除不斷預處理指令將導致混亂是推動其關閉,以一個新的SerializableAttribute類和基本欺騙編譯器。

#if PORTABLE 
namespace System 
{ 
    public class SerializableAttribute : Attribute 
    { 
     //this does nothing 
    } 
} 
#endif 

然後,只需繼續Serializable正常來裝飾你的類...

+4

謝謝!但是,這種解決方案的連續性功能會被忽略,對嗎? –

+0

這不起作用 - 有一個例外,如「類型***未標記爲可序列化」。 –

+0

嗯...根據這個評論https://forums.xamarin.com/discussion/comment/71885/#Comment_71885在這個鏈接我在這裏,這應該工作,但我也得到了「未標記」的例外。 – Barton

2

對於.Net 4.6及更高版本,DataContract不再可用於PCL。您需要添加Nuget包System.Runtime.Serialization.Primitives可在這裏:https://www.nuget.org/packages/System.Runtime.Serialization.Primitives/

注意實際的序列化,你可能還需要一個實現,如System.Runtime.Serialization.Json,System.Runtime.Serialization。 Xml或Newtonsoft.Json。

+0

我不知道你能做到這一點!爲我節省了一大堆時間,讓我的生活更輕鬆!謝謝! –