43

.NET Framework C#クラスライブラリをポータブルクラスライブラリに移植しています。[Serializable]この属性はポータブルクラスライブラリサブセットの一部ではないため、繰り返し発生する問題の1つは、属性で装飾されたクラスをどのように処理するかです。代わりに、ポータブルクラスライブラリサブセットのシリアル化機能は、 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; }

        ...
    }
4

3 に答える 3

43

ポータブルクラスライブラリ(PCL)が正式に非推奨になりました[2017年8月16日]

今日、異なる.NET実装間でコードを共有している場合は、おそらくポータブルクラスライブラリ(PCL)をご存知でしょう。.NET Standard 2.0のリリースに伴い、PCLは正式に非推奨になりました。プロジェクトを.NETStandardに移行する必要があります。

出典: .NETStandard2.0の発表

ポータブルクラスライブラリ(PCL)がすべてのプラットフォームで利用可能になりました[2013年10月14日]

本日のリリース以前は、PCL参照アセンブリにライセンス制限があり、Windowsでのみ使用できることを意味していました。本日のリリースでは、 Microsoft以外のプラットフォームを含むすべてのプラットフォームで使用できるライセンスを備えたPCLリファレンスアセンブリの新しいスタンドアロンリリースを発表します。 これにより、開発者はさらに柔軟性を高め、.NETで素晴らしいことを行うことができます。

出典: ポータブルクラスライブラリ(PCL)がすべてのプラットフォームで利用可能になりました

ダウンロード: Microsoft.NETポータブルライブラリリファレンスアセンブリ4.6RC

参考までに、許可されているアセンブリのセットは次のとおりです。

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(Silverlightから)

私の知る限り、フィールドにDataMember属性をマークし、 DataContract属性を追加する必要があります。

アップデート

はい。

Json.NETポータブルクラスライブラリソリューションがどのように実装されているかを見ることができます。ここからプロジェクトをダウンロードすると、 Source \ Src \ Newtonsoft.Json.Portableで解決策を見つけることができます。Json.NET4.5リリース10(ソース+バイナリ)

基本的に、彼らはカスタム属性プロバイダーによるアプローチを使用しています

//Serializableを使用しない

#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

ここで、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

[Serializable]の代わりに[DataContract]を使用して能力を失いますか、それとも[Serializable]がサポートするすべてのことを実行できますか?

名前と順序を設定する以外に、オブジェクトのシリアル化方法の制御を除いて、 Serializableがサポートするすべてのことを実行できます。

DataContractSerializerを使用すると、いくつかの利点があります。

[DataMember]公開されていなくても、装飾されたものはすべてシリアル化する

特に指示しない限り、何もシリアル化できません(「オプトイン」)

[Order=]の属性を使用して、要素がシリアル化される順序を定義できます。[DataMember]

逆シリアル化のためにパラメーターなしのコンストラクターを必要としません

XmlSerializerよりも10%高速です。

詳細はこちら:XmlSerializerとDataContractSerializer

参考までに:

DataContractデフォルトモードで次の種類のタイプのシリアル化をサポートします。CLR組み込みタイプ

バイト配列、DateTime、TimeSpan、GUI​​D、Uri、XmlQualifiedName、XmlElement、およびXmlNode配列

列挙型

DataContractまたはCollectionDataContract属性でマークされたタイプ

IXmlSerializableを実装するタイプ

List、Dictionary、Hashtableを含む配列とコレクションクラス

ISerializableを実装するものを含むSerializable属性でマークされたタイプ

上記の属性(POCO)がなく、デフォルトのコンストラクターを持つタイプ

于 2012-10-15T20:39:05.850 に答える
10

定数プリプロセッサディレクティブが引き起こす混乱を排除するためにできることの1つは、それを1つの新しいSerializableAttributeクラスにプッシュし、基本的にコンパイラをだますことです。

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

その後、通常どおりクラスを飾り続けますSerializable...

于 2012-10-15T20:29:00.717 に答える
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などの実装も必要になる可能性があることに注意してください。

于 2016-05-23T15:52:09.870 に答える