如何为我自己的模型提高Json.net Serializer的性能

时间:2013-01-08 13:42:34

标签: c# json serialization json.net deserialization

我有一个由大型复杂类组成的数据模型。在这里,您可以看到我的类的一般结构(我的模型的最小类之一)示例:

[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库以更有效地与我的实体一起工作。修改我的模型是不可能的,因为它确实是一个很大的项目,任何改变都会产生很大的影响。

我尝试了除Json.net之外的一些Json序列化库,包括ServiceStack.TextfastJson等。但它们对我没用。例如,ServiceStack.Text没有序列化私有字段,fastJson在序列化复杂实体方面存在问题,正如您在库的讨论页面上看到的那样......

简单地说,我下载了Json.net的源代码,为我自己的实体定制了库,但我迷失在库中。 :)你对我有什么建议来实现这种实体的性能提升吗?我只是在我的实体中序列化私有字段,所以我认为这可能是一个重点,但我不知道如何开始。

谢谢,

1 个答案:

答案 0 :(得分:1)

查看你的代码我想知道问题是在实际的序列化/反序列化中,还是在大量的if-then-else结构和onpropertychanged中你正在使用。我首先尝试使用布尔代数而不是这些if-then-else结构来优化它...或者尝试将它们全部删除。

e.g。 isModified =(value == null)|| (value.UnderlyingValue == null)|| (_maiden == null&amp;&amp; value == null)|| [...]

您还可以引入新的(公共)属性而不是私有属性,并使用[JsonIgnore]标记现有属性。

最后如果你真的不关心JSON或其他什么,我会考虑看一下protobuf-net。