0

大規模で複雑なクラスで構成されるデータ モデルがあります。ここでは、次の例 (モデルの最小クラスの 1 つ) でクラスの一般的な構造を確認できます。

[DataContract(IsReference = true)]
public partial class Name : PresentationBase
{
    [DataMember]
    private SmartProperty<string> _first;
    public SmartProperty<string> First
    {
        get { return this._first ?? (this._first = new SmartProperty<string>()); }
        set
        {
            bool isModified = false;

            if (this._first == null)
            {
                if (value != null)
                {
                    isModified = true;
                }
            }
            else if (value == null)
            {
                isModified = true;
            }
            else if (this._first.UnderlyingValue == null)
            {
                if (value.UnderlyingValue != null)
                {
                    isModified = true;
                }
            }
            else if (value.UnderlyingValue == null)
            {
                isModified = true;
            }
            else if (!value.UnderlyingValue.Equals(this._first.UnderlyingValue))
            {
                isModified = true;
            }

            this._first = value;

            if (isModified)
            {
                this._first.IsModified = isModified;
                this.OnPropertyChanged("First");
            }
        }
    }

    [DataMember]
    private SmartProperty<string> _last;
    public SmartProperty<string> Last
    {
        get { return this._last ?? (this._last = new SmartProperty<string>()); }
        set
        {
            bool isModified = false;

            if (this._last == null)
            {
                if (value != null)
                {
                    isModified = true;
                }
            }
            else if (value == null)
            {
                isModified = true;
            }
            else if (this._last.UnderlyingValue == null)
            {
                if (value.UnderlyingValue != null)
                {
                    isModified = true;
                }
            }
            else if (value.UnderlyingValue == null)
            {
                isModified = true;
            }
            else if (!value.UnderlyingValue.Equals(this._last.UnderlyingValue))
            {
                isModified = true;
            }

            this._last = value;

            if (isModified)
            {
                this._last.IsModified = isModified;
                this.OnPropertyChanged("Last");
            }
        }
    }

    [DataMember]
    private SmartProperty<string> _maiden;
    public SmartProperty<string> Maiden
    {
        get { return this._maiden ?? (this._maiden = new SmartProperty<string>()); }
        set
        {
            bool isModified = false;

            if (this._maiden == null)
            {
                if (value != null)
                {
                    isModified = true;
                }
            }
            else if (value == null)
            {
                isModified = true;
            }
            else if (this._maiden.UnderlyingValue == null)
            {
                if (value.UnderlyingValue != null)
                {
                    isModified = true;
                }
            }
            else if (value.UnderlyingValue == null)
            {
                isModified = true;
            }
            else if (!value.UnderlyingValue.Equals(this._maiden.UnderlyingValue))
            {
                isModified = true;
            }

            this._maiden = value;

            if (isModified)
            {
                this._maiden.IsModified = isModified;
                this.OnPropertyChanged("Maiden");
            }
        }
    }
}

シリアル化/逆シリアル化操作にJson.netを使用しています。私のモデルは複雑であるため、Json.net ライブラリをパーソナライズしてエンティティをより効率的に操作できるかどうか疑問に思っています。私のモデルを修正することは不可能です。これは本当に大きなプロジェクトであり、変更は大きな影響を与えるからです。

ServiceStack.TextfastJsonなど、 Json.net以外の Json シリアル化ライブラリをいくつか試しましたが、役に立ちませんでした。たとえば、ServiceStack.Text はプライベート フィールドをシリアル化しません。ライブラリのディスカッション ページでわかるように、fastJson は複雑なエンティティのシリアル化に問題があります...

簡単に言うと、Json.net のソース コードをダウンロードして、独自のエンティティ用にライブラリをカスタマイズしましたが、ライブラリで迷子になりました。:) この種のエンティティのパフォーマンスを改善するための提案はありますか? 私は自分のエンティティでプライベート フィールドのみをシリアル化しているので、これはポイントになると思いますが、開始方法がわかりません。

ありがとう、

4

1 に答える 1

1

あなたのコードを見て、問題が実際のシリアライゼーション/デシリアライゼーションにあるのか、それとも多数の if-then-else 構造と onpropertychanged にあるのか疑問に思っています。最初に、これらの if-then-else 構造ではなくブール代数を使用して最適化を試みるか、それらをすべて一緒に削除しようとします。

例 isModified = (値 == null) || (value.UnderlyingValue == null) || (_maiden==ヌル&&値==ヌル) || [...]

また、プライベート プロパティの代わりに新しい (パブリック) プロパティを導入し、既存のプロパティを [JsonIgnore] でマークすることもできます。

最後に、JSON などをあまり気にしない場合は、protobuf-net を検討することを検討してください。

于 2013-01-08T14:01:57.553 に答える