Как сделать автоматическое определение типа при сериализации в XML - PullRequest
0 голосов
/ 06 января 2012

Когда я пытаюсь сериализовать данные в XML, я использую этот полезный класс: http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx

Итак, у меня есть:

public class LocalizableString : SerializableDictionary<string, object>
    {
        public object Get(string language)
        {
            return this[language];
        }

        public void Set(string language, string value)
        {
            Util.SetDictionaryValue<string, object>(this, language, value);
        }
    }

Если я использую обычный код этого:

public void WriteXml(System.Xml.XmlWriter writer)
        {

            XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
            XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
            foreach (TKey key in this.Keys)
            {
                writer.WriteStartElement("item");
                writer.WriteStartElement("key");
                keySerializer.Serialize(writer, key);
                writer.WriteEndElement();
                writer.WriteStartElement("value");

                TValue value = this[key];
                valueSerializer.Serialize(writer, value);
                writer.WriteEndElement();
                writer.WriteEndElement();
            }
        }

Я получу:

<PersonenListe>
  <PersonenArray>
    <PersonObjekt>
      <PropertyType>Unknown</PropertyType>
      <ID>0</ID>
      <FriendlyName>Max Man</FriendlyName>
      <City>Capitol City</City>
      <Age>33</Age>
      <Name>
        <item>
          <key>
            <string>test1</string>
          </key>
          <value>
            <anyType xmlns:q1="http://www.w3.org/2001/XMLSchema" p8:type="q1:string" xmlns:p8="http://www.w3.org/2001/XMLSchema-instance">test2</anyType>
          </value>
        </item>
      </Name>
    </PersonObjekt>
  </PersonenArray>
</PersonenListe>

Но мне нужно иметь код с автоматическим определением типа, как указано выше, но без кода anyType (только с типом свойства), как в следующемпример:

<PersonenArray>
    <PersonObjekt>
      <PropertyType>Unknown</PropertyType>
      <ID>0</ID>
      <FriendlyName>Max Man</FriendlyName>
      <City>Capitol City</City>
      <Age>33</Age>
      <Name>
        <item>
          <key>
            <string>test1</string>
          </key>
          <value>
            <string>test2</string>
          </value>
        </item>
      </Name>
    </PersonObjekt>
  </PersonenArray>
</PersonenListe> 

1 Ответ

0 голосов
/ 06 января 2012

Это потому, что ваш основной словарь набирается <string, object>.Если ваши ключи и значения всегда будут строками, измените вашу первую строку с

public class LocalizableString : SerializableDictionary<string, object>

на

public class LocalizableString : SerializableDictionary<string, string>

И я думаю, это решит вашу проблему.

...