3

I have a class which communicates with an API and needs to do some transformations to any data it touches. This class is the equivalent too:

public class SerializeMe
{
    public SerializeMe(string someString)
    {
        _someString = someString;
    }

    private string _someString;
    public string TransformedValue
    {
        get { _someString = TransformToSomething();
              return _someString; }
        set { _someString = value; }
    }
}

For my API callers I log every request and response by serializing these classes. They act as xml schemas almost.

Now everything works perfectly my only issue is that somebody could theoretically try and set and end up not getting their expected results back. Its mainly a design issue just trying to make my code responsible. I'd love to be able to use a private set on this but the XmlSerializer complains about it.

Is there a attribute or another technique to be able to make Transformed value as unsettable except by the serializer?

Also If there isn't an option, making the property as Obsolete is an option. Is there any other more appropriate attribute to use?

4

3 に答える 3

2

これは XmlSerializer では面倒ですが、DataContractSerialzer では問題ありません (XmlSerializer が必要とするパラメーターなしの ctor がなくても機能します)。タイプを [DataContract] としてマークし、フィールド(プロパティではない) を [DataMember] としてマークするだけです。

[DataContract]
public class SerializeMe
{
    public SerializeMe(string someString)
    {
        _someString = someString;
    }
    [DataMember]
    private string _someString;
    public string TransformedValue
    {
        get { _someString = TransformToSomething();
              return _someString; }
        private set { _someString = value; }
    }
}
于 2010-10-18T14:48:38.430 に答える
2

XmlSerializer はすぐに使える多くの機能を備えていますが、柔軟性を得るには、IXmlSerializableインターフェイスの使用を検討する必要があります。XmlSerializer はオブジェクトを調べ、IXmlSerializable を実装している場合は、インターフェイスによって公開されたオブジェクトのメソッドを呼び出します。はい、それはより多くの作業ですが、オブジェクトがどのようにデ/シリアル化されるかについて、よりきめ細かいアプローチがあります。

于 2010-10-18T14:08:36.950 に答える
0

残念ながら、XmlSerializer は public の getter/setter を使用してプロパティをシリアル化することしかできません (もちろん、 を介して独自のシリアル化を指定しない限りIXmlSerializable)。

私がときどき使用した唯一の回避策 (これはハックであり、.NET の設計ガイドラインに準拠していないため、まったくやりたくありません) は、空のセッターを持つパブリック プロパティを用意してから、プライベート バッキング変数を設定する別の方法:

public class SerializeMe
{
    private string _someString;
    public string SomeString
    {
        get
        {
            _someString = TransformToSomething();
            return _someString;
        }
        set { }
    }

    public void SetString(string val) { _someString = val; }
}

明らかにIXmlSerializable手間がかかりますが、長期的には間違いなくより良い決定です (ハックではないという事実は言うまでもありません)。

于 2010-10-18T14:08:19.930 に答える