2016-08-18 2 views
1

Я пытаюсь выполнить сериализацию нескольких списков в уникальный XML-файл. Мой проект - это UWP, поэтому кажется, что он сериализует мой список 3, но файл отображается пустым. Ранее пользователь помогал мне с частью кода. Как правильно его сериализовать.C# XML Сериализация в UWP

Для выполнения моего кода используйте только: "project();"

Весь мой код:

using Project.Common; 
using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Xml.Serialization; 
using Windows.Storage; 
using System.Threading.Tasks; 

namespace Project 
{ 
    public class All_Classes 
    { 
     public class List1 : BindableBase 
     { 
      private int _Property1; 
      public int Property1 
      { 
       get { return _Property1; } 
       set { SetProperty(ref _Property1, value); } 
      } 

      private bool _Property2; 
      public bool Property2 
      { 
       get { return _Property2; } 
       set { SetProperty(ref _Property2, value); } 
      } 

      private bool _Property3; 
      public bool Property3 
      { 
       get { return _Property3; } 
       set { SetProperty(ref _Property3, value); } 
      } 
     } 

     public class List2 : BindableBase 
     { 

      private bool _Property1; 
      public bool Property1 
      { 
       get { return _Property1; } 
       set { SetProperty(ref _Property1, value); } 
      } 

      private bool _Property2; 
      public bool Property2 
      { 
       get { return _Property2; } 
       set { SetProperty(ref _Property2, value); } 
      } 
     } 

     public class List3 : BindableBase 
     { 
      private double _Property1; 
      public double Property1 
      { 
       get { return _Property1; } 
       set { SetProperty(ref _Property1, value); } 
      } 

      private double _Property2; 
      public double Property2 
      { 
       get { return _Property2; } 
       set { SetProperty(ref _Property2, value); } 
      } 

      private double _Property3; 
      public double Property3 
      { 
       get { return _Property3; } 
       set { SetProperty(ref _Property3, value); } 
      } 

      private double _Property4; 
      public double Property4 
      { 
       get { return _Property4; } 
       set { SetProperty(ref _Property4, value); } 
      } 

     } 

     public class Values_List1 : ObservableCollection<List1> 
     { 
     } 
     public class Values_List2 : ObservableCollection<List2> 
     { 
     } 
     public class Values_List3 : ObservableCollection<List3> 
     { 
     } 

     public static class ApplicationServices 
     { 
      public static Values_List1 List1 = new Values_List1(); 
      public static Values_List2 List2 = new Values_List2(); 
      public static Values_List3 List3 = new Values_List3(); 

      static ApplicationServices() 
      { 
      } 
     } 

     public static void AddNewData() 
     { 
      ApplicationServices.List1.Add(new List1() 
      { 
       Property1 = 1, 
       Property2 = true, 
       Property3 = false, 

      }); 

      ApplicationServices.List2.Add(new List2() 
      { 
       Property1 = false, 
       Property2 = true, 
      }); 

      ApplicationServices.List3.Add(new List3() 
      { 
       Property1 = 3.564, 
       Property2 = 0.215, 
       Property3 = 0.7252, 
       Property4 = 23.463, 
      }); 
     } 

     public static async void SaveObjectToXml<T>(T objectToSave) 
     { 
      //<-----------FilePicker------------------> 
      var savePicker = new Windows.Storage.Pickers.FileSavePicker(); 
      savePicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary; 
      savePicker.FileTypeChoices.Add("New File", new List<string>() { ".xml" }); 
      savePicker.SuggestedFileName = "New File"; 
      StorageFile newfile = await savePicker.PickSaveFileAsync(); 
      //<-----------FilePicker------------------> 
      //<----------------Serializacion------------------> 

      var serializer = new XmlSerializer(typeof(T)); 

      Stream stream = await newfile.OpenStreamForWriteAsync(); 


      using (stream) 
      { 
       serializer.Serialize(stream, objectToSave); 
      } 
      //<----------------Serializacion------------------> 

     } 

     public class myCompoundClass 
     { 
      public List1 List1 { get; set; } 
      public List2 List2 { get; set; } 
      public List3 List3 { get; set; } 
     } 

     public static void project() 
     { 
      myCompoundClass new_instance = new myCompoundClass(); 
      AddNewData(); 
      SaveObjectToXml(new_instance); 
     } 

    } 
} 

Я хочу получить что-то похожее на это:

<?xml version="1.0" encoding="utf-8"?> 
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <List1> 
    <Property1>1</Property1> 
    <Property2>true</Property2> 
    <Property3>false</Property3> 
    <ToAcero>0.1</ToAcero> 
    </List1> 
    <List2> 
    <Property1>true</Property1> 
    <Property2>true</Property2> 
    </List2> 
    <List3> 
    <Property1>3.564</Property1> 
    <Property2>0.215</Property2> 
    <Property3>0.7252</Property3> 
    <Property4>23.463</Property4> 
    </List3> 
</Root> 

Любая помощь приветствуется.

ответ

1

Вы никогда не устанавливать какие-либо из значений свойств List1 или List2 или List3 внутри вашего myCompoundClass:

 myCompoundClass new_instance = new myCompoundClass(); 
     AddNewData(); 
     // new_instance was not passed to AddNewData and so its properties have their default values of null. 
     SaveObjectToXml(new_instance); 

Таким образом, все его свойства еще будет null. Вот почему ваш XML-файл пуст. Перед сериализации вам необходимо перенести данные с static class ApplicationServices на new_instance.

Update

Вы спрашиваете, как я могу заполнить "new_instance" с ApplicationServices? Ваша проблема в том, что вы хотели бы сериализовать свой класс ApplicationServices, но он является статическим классом и поэтому не может быть сериализован как-есть. Мои предложения были бы следующими:

  1. Переименовать свои типы. У вас есть такие типы, как List1, которые не содержит. Я хотел бы предложить что-то вроде следующего:

    public class Values1 : BindableBase // Formerly List1 
    { 
        // Contents unchanged 
    } 
    
    public class Values2 : BindableBase // Formerly List2 
    { 
        // Contents unchanged 
    } 
    
    public class Values3 : BindableBase // Formerly List3 
    { 
        // Contents unchanged 
    } 
    
    public class Values1List : ObservableCollection<Values1> 
    { 
    } 
    public class Values2List : ObservableCollection<Values2> 
    { 
    } 
    public class Values3List : ObservableCollection<Values3> 
    { 
    } 
    

    Существующие соглашения об именовании, вводят в заблуждение относительно того, что и не является коллекцией.

    Кроме того, я предлагаю вам не встраивать их в класс All_Classes. Это делает сложность, а не ясность.

  2. Сделать статические списки значений только для чтения:

    public static class ApplicationServices 
    { 
        public static readonly Values1List List1 = new Values1List(); 
        public static readonly Values2List List2 = new Values2List(); 
        public static readonly Values3List List3 = new Values3List(); 
    
        static ApplicationServices() 
        { 
        } 
    } 
    
  3. Поскольку вы не можете сериализовать статического типа, ввести следующие данные объекта передачи для сериализации:

    [XmlRoot("Root")] 
    public class ApplicationServicesDTO 
    { 
        [XmlElement] 
        public Values1List List1 { get { return ApplicationServices.List1; } } 
    
        [XmlElement] 
        public Values2List List2 { get { return ApplicationServices.List2; } } 
    
        [XmlElement] 
        public Values3List List3 { get { return ApplicationServices.List3; } } 
    } 
    

    Некоторые заметки:

    • Обратите внимание, что List свойства получаются только.В общем случае XmlSerializer не будет сериализовать свойства get-only, но он будет сериализовать get-only свойства коллекции, когда сбор предварительно выделен.

    • [XmlRoot("Root")] указывает, что тип должен быть сериализован корневым элементом с именем <Root>.

    • [XmlElement]10, примененный к свойству коллекции, указывает, что сборка должна быть сериализована как повторяющаяся последовательность элементов без внешнего элемента контейнера.

Теперь вы сможете сделать:

var new_instance = new ApplicationServicesDTO(); 

И вы статические списки будут получить сериализации с форматом XML вы хотите.

Обратите внимание, что если вы захотите десериализовать свой XML, вы можете сначала очистить предварительно существующие списки внутри ApplicationServices. Для пояснения см. XML Deserialization of collection property with code defaults.

+0

Что сбой, ваш правый сэр, но мне нужно добавить мои данные в ApplicationServices, но он статичен, но я не могу его выразить, как я могу заполнить «new_instance» ApplicationServices, вы можете мне помочь? – Julius