1

私は次のようなxmlを持っています:

<Settings>
  <User default="Programmer"></User>
  <Level default="2"></Level>
<Settings>

これは UserSettings 型のオブジェクトに逆シリアル化されます。

[Serializable]
[XmlRoot("Settings")]
public class UserSettings
{
    [XmlElement("User")]
    public string User { get; set; }

    [XmlElement("Level")]
    public string Level { get; set; }

}

UserSettings オブジェクトは、実行時にタグの値が何であれ提供します。

タグが空の場合、または受信 xml にタグがない場合に、クラスがデフォルトの属性値を返すようにします。

したがって、タイプ UserSettings のオブジェクト objUserSettings がある場合、

objUserSettings.User

タグ User が空の場合は、「Programmer」、または xml のデフォルト属性値にあるものを指定する必要があります。

よろしく。

4

4 に答える 4

1

この質問を楽しんだので、別の回答を追加します。それを取るか、そのままにしておきますが、これはおそらく私がこの機能を攻撃する方法です.

これはより複雑な答えですが、ジェネリックを使用してタイプ セーフを提供し、ほとんどの面倒な作業は 1 つの基本クラスで行われます (同じコードを何度もコピー/貼り付けする必要はありません)。

別のタイプの例を示すために、UserSettings にプロパティを追加しました...

[Serializable]
[XmlRoot("Settings")]
public class UserSettings
{
    public UserSettings()
    {
        User = new DefaultableStringValue();
        Level = new DefaultableIntegerValue();
        IsFullscreen = new DefaultableBooleanValue();
    }

    [XmlElement("User")]
    public DefaultableStringValue User { get; set; }

    [XmlElement("Level")]
    public DefaultableIntegerValue Level { get; set; }

    [XmlElement("IsFullscreen")]
    public DefaultableBooleanValue IsFullscreen { get; set; }
}

型指定された DefaultableValues の単純な実装...

[Serializable]
public class DefaultableStringValue : DefaultableValue<string>
{
    public DefaultableStringValue() : base(s => s) { }
}

[Serializable]
public class DefaultableIntegerValue : DefaultableValue<int>
{
    public DefaultableIntegerValue() : base(int.Parse) { }
}

[Serializable]
public class DefaultableBooleanValue : DefaultableValue<bool>
{
    public DefaultableBooleanValue() : base(bool.Parse) { }
}

解析された値の解析とキャッシュの面倒な作業をすべて行う基本クラス...

[Serializable]
public abstract class DefaultableValue<T>
{
    protected Func<string, T> _parsingFunc;

    private string _valueText;
    private T _cachedValue;
    private bool _isValueCached;

    private string _defaultText;
    private T _cachedDefault;
    private bool _isDefaultCached;

    protected DefaultableValue(Func<string, T> parsingFunc)
    {
        _parsingFunc = parsingFunc;
        _isValueCached = false;
        _isDefaultCached = false;
    }

    [XmlAttribute("default")]
    public string DefaultText
    {
        get { return _defaultText; }
        set
        {
            _defaultText = value;
            _isDefaultCached = false;
        }
    }

    [XmlText]
    public string ValueText
    {
        get { return _valueText; }
        set
        {
            _valueText = value;
            _isValueCached = false;
        }
    }

    [XmlIgnore]
    public T Default
    {
        get
        {
            if (_isDefaultCached)
                return _cachedDefault;

            if (HasDefault)
                return ParseAndCacheValue(DefaultText, out _cachedDefault, out _isDefaultCached);

            return default(T);
        }
        set
        {
            DefaultText = value.ToString();
            _cachedDefault = value;
            _isDefaultCached = true;
        }
    }

    [XmlIgnore]
    public T Value
    {
        get
        {
            if (_isValueCached)
                return _cachedValue;

            if (HasValue)
                return ParseAndCacheValue(ValueText, out _cachedValue, out _isValueCached);

            return Default;
        }
        set
        {
            ValueText = value.ToString();
            _cachedValue = value;
            _isValueCached = true;
        }
    }

    [XmlIgnore]
    public bool HasDefault { get { return !string.IsNullOrEmpty(_defaultText); } }

    [XmlIgnore]
    public bool HasValue { get { return !string.IsNullOrEmpty(_valueText); } }

    private T ParseAndCacheValue(string text, out T cache, out bool isCached)
    {
        cache = _parsingFunc(text);
        isCached = true;

        return cache;
    }
}

そして、使用法を示すサンプルプログラム...

public class Program
{
    private static void Main(string[] args)
    {
        UserSettings userSettings = new UserSettings();
        userSettings.User.Default = "Programmer";
        userSettings.Level.Default = 2;
        userSettings.Level.Value = 99;

        XmlSerializer xmlSerializer = new XmlSerializer(typeof(UserSettings));

        string serializedUserSettings;
        using (StringWriter stringWriter = new StringWriter())
        {
            xmlSerializer.Serialize(stringWriter, userSettings);
            serializedUserSettings = stringWriter.GetStringBuilder().ToString();
        }

        UserSettings deserializedUserSettings;
        using (StringReader stringReader = new StringReader(serializedUserSettings))
        {
            deserializedUserSettings = (UserSettings)xmlSerializer.Deserialize(stringReader);
        }

        Console.Out.WriteLine("User: HasDefault={0}, Default={1}, HasValue={2}, Value={3}", 
            deserializedUserSettings.User.HasDefault ? "Yes" : "No", 
            deserializedUserSettings.User.Default,
            deserializedUserSettings.User.HasValue ? "Yes" : "No", 
            deserializedUserSettings.User.Value);

        Console.Out.WriteLine("Level: HasDefault={0}, Default={1}, HasValue={2}, Value={3}",
            deserializedUserSettings.Level.HasDefault ? "Yes" : "No",
            deserializedUserSettings.Level.Default,
            deserializedUserSettings.Level.HasValue ? "Yes" : "No",
            deserializedUserSettings.Level.Value);

        Console.Out.WriteLine("IsFullscreen: HasDefault={0}, Default={1}, HasValue={2}, Value={3}",
            deserializedUserSettings.IsFullscreen.HasDefault ? "Yes" : "No",
            deserializedUserSettings.IsFullscreen.Default,
            deserializedUserSettings.IsFullscreen.HasValue ? "Yes" : "No",
            deserializedUserSettings.IsFullscreen.Value);

        Console.ReadLine();
    }
}
于 2013-01-21T08:45:43.267 に答える
1

これを試して

using System.ComponentModel;

[Serializable]
[XmlRoot("Settings")]
public class UserSettings
{
    [DefaultValue("Yogesh")]
    [XmlElement("User")]
    public string User { get; set; }

    [DefaultValue("1st")]
    [XmlElement("Level")]
    public string Level { get; set; }

}

詳細については、これを参照してください。

于 2013-01-21T06:02:06.463 に答える
0

プロパティに Default Value 属性を使用できます。

あなたの場合は、

[Serializable]
[XmlRoot("Settings")]
public class UserSettings
{
    [XmlElement("User")]
    [DefaultValue("Programmer")]
    public string User { get; set; }

    [XmlElement("Level")]
    [DefaultValue(2)]
    public string Level { get; set; }

}
于 2013-01-21T06:10:44.603 に答える
0

そのデフォルトのxml属性を使用するように文字列に指示する方法があるとは思いません。これらの各オブジェクトを、xml 属性であるプロパティとしてデフォルト値を持つ構造に逆シリアル化する必要があります。

ここに例があります...

[Serializable]
[XmlRoot("Settings")]
public class UserSettings
{
    [XmlElement("User")]
    public DefaultableValue User { get; set; }

    [XmlElement("Level")]
    public DefaultableValue Level { get; set; }

}

[Serializable]
public class DefaultableValue
{
    [XmlAttribute("default")]
    public string Default { get; set; }

    [XmlText]
    public string Value { get; set; }
}

そして、使用法を示すサンプルプログラム...

public class Program
{
    private static void Main(string[] args)
    {
        UserSettings userSettings = new UserSettings();
        userSettings.User = new DefaultableValue()
            {
                Default = "Programmer", 
                Value = "Tyler"
            };
        userSettings.Level = new DefaultableValue()
            {
                Default = "2", 
                Value = "99"
            };

        XmlSerializer xmlSerializer = new XmlSerializer(typeof(UserSettings));

        string serializedUserSettings;
        using (StringWriter stringWriter = new StringWriter())
        {
            xmlSerializer.Serialize(stringWriter, userSettings);
            serializedUserSettings = stringWriter.GetStringBuilder().ToString();
        }

        UserSettings deserializedUserSettings;
        using (StringReader stringReader = new StringReader(serializedUserSettings))
        {
            deserializedUserSettings = (UserSettings)xmlSerializer.Deserialize(stringReader);
        }

        Console.Out.WriteLine("User: Default={0}, Actual={1}", 
            deserializedUserSettings.User.Default, 
            deserializedUserSettings.User.Value);

        Console.Out.WriteLine("Level: Default={0}, Actual={1}", 
            deserializedUserSettings.Level.Default, 
            deserializedUserSettings.Level.Value);
    }
}

(コードにデフォルト値があることに注意してください。ただし、それらはxmlファイルから取得できた可能性が非常に高いです)

于 2013-01-21T07:22:33.493 に答える