9

みなさん、良い一日を、

私は独立したゲーム開発者であり、過去には主にXNAを使用し、他の極端な場合は商用ツールセットを使用していました。ただし、XNAの到達範囲はかなり限られており、複数のプラットフォームを対象とするクロスプラットフォームの抽象化レイヤーを構築しています。

簡単に言うと、[Serializable]よりも広くアクセスできるxmlシリアル化が必要であり、データコントラクトが指摘されています。私は多くの調査を行ってきましたが、継承とオーバーライドに関連するシステムの基本のいくつかについての良い情報を見つけることができません。

私の質問の核心は...

[DataContract]
public class Node
{
    private string name;

    public string Name { get { return name; } set { name = value; } }
    public virtual float Rotation { get { return 0f; } set { } }
}

[DataContract]
public class FancyNode : Node
{
    private float rotation;

    public override float Rotation { get { return rotation; } set { rotation = value; } }
}

'FancyNode'をシリアル化すると、'Rotation'は適切にシリアル化され、'Name'はシリアル化されますか?

フォローアップの質問: 先に質問するつもりでしたが、当時は思い出せませんでした。シリアライザーハンドラーは[IgnoreDataMember]プロパティをどのようにオーバーライドしますか?例えば...

[DataContract]
public class Simple
{
    [IgnoreDataMember]
    public virtual string Value { get { return ""; } set { } }
}

[DataContract]
public class Complex : Simple
{
    private string value;

    public override string Value { get { return value; } set { this.value = value; } }
}

「Complex」の「Value」はシリアル化されますか?[DataMember]タグが使用されていない場合、すべてのプロパティがシリアル化されることを示唆する回答もあります。もしそうなら、基本クラスの[IgnoreDataMember]属性は何か関係がありますか?

4

4 に答える 4

6

私の知る限り、DataContractは「オプトイン」シリアル化方式です。つまり、装飾しない限り、ものはシリアル化されません(シリアル化するようにシリアライザーに伝えます)。

したがって、上記の例では、シリアル化するプロパティに[DataMember]を追加する必要があります

標準のSerializable属性を使用すると、シリアライザーはすべてのフィールドを調べ、NonSerializedとしてマークしたフィールドのみを無視します。

ここにいくつかの例:

http://jamescbender.azurewebsites.net/?p=651

何がシリアル化されるか、および何が起こるかの大まかな概要については、これに関するメモのセクションを確認してください。

http://msdn.microsoft.com/en-us/library/ms733127.aspx

編集:また、[DataMember]としてマークされたフィールドのいずれかが正しくシリアル化されない理由もわかりません。シリアル化のDataContractメソッドは、循環参照も処理できます。これは、他のシリアル化で問題が発生する場合があります。

http://msdn.microsoft.com/en-us/library/hh241056.aspx

于 2012-06-20T08:47:31.773 に答える
6

いくつかの回答で提示されたいくつかの考えは不明確です。片付けさせてください。まず、DataContractを使用するシリアライザーを使用して、DataContractで装飾されていないタイプをシリアライズできます。あなたはそれらについてserailizerに知らせる必要があるだけです。

たとえば、DataContractJsonSerializerクラスは、型をJSONオブジェクト(通常は文字列)にシリアル化します。シリアル化するオブジェクトの型と、それが参照する可能性のある他の型だけを伝える必要があります。

var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(MyClass), new Type[] { Type1, Type2, Type3 });

シリアライザーは、タイプの各パブリックフィールドとプロパティを自動的にシリアル化します。詳細については、http://msdn.microsoft.com/en-us/ms733127を参照してください。

DataContractAttributeマークされたタイプ

型をでマークしたら、DataContractAttributeその型を自動的に既知の型(子型として指定する必要はありません)に変換し、プロパティとフィールドに変換してオプトインモードにします。

したがって、シリアル化する各フィールドまたはプロパティをで装飾する必要がありますDataMemberAttribute。これは、IgnoreDataMemberAttributeが役に立たないことを意味します。つまり、でマークされていないものDataMemberAttributeは自動的に無視されるため、シリアライザーはそれを検索しません。

マークされていないDataContractAttributeタイプ

前述のように、DataContractAttributeが適用されていないタイプをシリアル化する場合、各パブリックプロパティまたはフィールドがシリアル化されます。したがって、IgnoreDataMemberAttributeここでは、プロパティまたはフィールドがシリアル化されないようにするために使用されます。

于 2013-12-05T05:16:29.020 に答える
1

[DataMember]コントラクトによって公開される必要があるプロパティに属性を含める必要があります。

[DataContract]
public class FancyNode : Node
{
    private float rotation;

    [DataMember]
    public override float Rotation { get { return rotation; } set { rotation = value; } }
}

Windows Communication Foundation(WCF)は、データコントラクトシリアライザーを使用してデータをシリアル化および逆シリアル化(XMLとの間で変換)することに注意してください。したがって、実際にはまだXmlシリアル化を使用しています。

于 2012-06-20T08:46:53.333 に答える
0

いいえ、オプトインアプローチのためにシリアル化されません。基本クラスにDataMemberを明示的に適用する必要があります。子クラスで継承した場合、データのシリアル化は自動的に機能しません

于 2012-06-20T09:07:38.190 に答える