2013-07-27 3 views
-1

Я хочу сохранить свои модели в виде отдельных файлов XML, которые люди могут загружать, сохранять и импортировать. Могу ли я сериализовать/десериализовать типы систем, такие как Enums и System.Windows.Media.Color для XML-файлов?Могу ли я сериализовать/десериализовать системные типы в XML?

public enum WeatherType 
{ 
    Rainy, 
    Sunny, 
    Cloudy, 
    Windy 
} 

[Serializable] 
[XmlRoot("Profile")] 
public class Profile 
{ 
    public string ProfileName { get; set; } 
    public System.Windows.Media.Color ProfileColor { get; set; } 
    public string City { get; set; } 
    public double MinTemp { get; set; } 
    public double MaxTemp { get; set; } 
    public List<WeatherType> WeatherTypes { get; set; } 
} 

Не могу заставить его работать:/

+1

Перечисления сериализуемы по определению. «Цвет» тоже сериализуется. В чем проблема? – Dennis

+0

Что не работает? Можете ли вы отправить код, где вы столкнулись с проблемой? –

+0

Пожалуйста, взгляните на мой ответ. –

ответ

1

Не знаете, в чем проблема. Можете ли вы дать дополнительную информацию.

Вот пример кода

static void Main(string[] args) 
{ 
    Profile p = new Profile(); 
    p.ProfileColor = System.Windows.Media.Color.FromArgb(1, 1, 1, 0); 
    p.WeatherTypes = new List<WeatherType> 
     { 
      WeatherType.Cloudy, 
      WeatherType.Windy 
     }; 
    var serializer = new XmlSerializer(typeof(Profile)); 
    var sb = new StringBuilder(); 
    TextWriter writer = new StringWriter(sb); 
    serializer.Serialize(writer, p); 
    Console.WriteLine(sb.ToString()); 
} 

и вот XML-

<?xml version="1.0" encoding="utf-16"?> 
<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ProfileColor> 
    <A>1</A> 
    <R>1</R> 
    <G>1</G> 
    <B>0</B> 
    <ScA>0.003921569</ScA> 
    <ScR>0.000303527</ScR> 
    <ScG>0.000303527</ScG> 
    <ScB>0</ScB> 
    </ProfileColor> 
    <MinTemp>0</MinTemp> 
    <MaxTemp>0</MaxTemp> 
    <WeatherTypes> 
    <WeatherType>Cloudy</WeatherType> 
    <WeatherType>Windy</WeatherType> 
    </WeatherTypes> 
</Profile> 
1

enum и Color сериализуемы по определению (украшенного SerializableAttribute), так что не должно быть никаких проблем сериализации enum или Color свойства, обратите внимание на мой пример кода:

public class Program 
{ 
    public static void Main() 
    { 
     using (var writer = XmlWriter.Create(Console.OpenStandardOutput())) 
     { 
      var telAvivProfile = new Profile 
       { 
        City = "Tel Aviv", 
        MaxTemp = 40, 
        MinTemp = 5, 
        ProfileColor = Color.FromRgb(4, 4, 4), 
        WeatherTypes = new List<WeatherType> 
         { 
          WeatherType.Sunny, 
          WeatherType.Rainy 
         } 
       }; 

      var serializer = new XmlSerializer(telAvivProfile.GetType()); 
      serializer.Serialize(writer, telAvivProfile); 

      Console.WriteLine(writer.ToString()); 
     } 
     Console.ReadLine(); 
    } 
} 

public enum WeatherType 
{ 
    Rainy, 
    Sunny, 
    Cloudy, 
    Windy 
} 

[Serializable] 
[XmlRoot("Profile")] 
public class Profile 
{ 
    public string ProfileName { get; set; } 
    public System.Windows.Media.Color ProfileColor { get; set; } 
    public string City { get; set; } 
    public double MinTemp { get; set; } 
    public double MaxTemp { get; set; } 
    public List<WeatherType> WeatherTypes { get; set; } 
} 

будет производить вам следующий XML:

<?xml version="1.0" encoding="utf-8"?> 
<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ProfileColor=""> 
    <A>255</A> 
    <R>4</R> 
    <G>4</G> 
    <B>4</B> 
    <ScA>1</ScA> 
    <ScR>0.001214108</ScR> 
    <ScG>0.001214108</ScG> 
    <ScB>0.001214108</ScB> 
    </ProfileColor> 
    <City>Tel Aviv</City> 
    <MinTemp>5</MinTemp> 
    <MaxTemp>45</MaxTemp> 
    <WeatherTypes> 
     <WeatherType>Sunny</WeatherType> 
     <WeatherType>Rainy</WeatherType> 
    </WeatherTypes> 
</Profile> 

Кроме того, если вы хотите контролировать, как ваши enum поля сериализовать из то вы можете украсить каждое поле с атрибутом XmlEnum, например:

public enum WeatherType 
{ 
    [XmlEnum(Name="Hot")] 
    Rainy, 
    Sunny, 
    Cloudy, 
    Windy 
} 

А вот как вы можете Deserialize/Load ваш XML из файла:

Profile loadedProfile = null; 
    string path = "telAvivProfile.xml"; 

    XmlSerializer serializer = new XmlSerializer(typeof (Profile)); 
    StreamReader reader = new StreamReader(path); 
    loadedProfile = (Profile) serializer.Deserialize(reader); 

    reader.Close(); 
Смежные вопросы