2016-06-14 3 views
2

Я пытаюсь сохранить класс в читаемом формате (XML). Проблема, результирующий файл только выводится как:XML Сериализация результатов класса Empty XML

<?xml version="1.0" encoding="Windows-1252"?> 
<ExtremeLearningMachine xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /><?xml version="1.0" encoding="Windows-1252"?> 
<ExtremeLearningMachine xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /><?xml version="1.0" encoding="Windows-1252"?> 
<ExtremeLearningMachine xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /><?xml version="1.0" encoding="Windows-1252"?> 
<ExtremeLearningMachine xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> 

Вот мой класс:

public class ExtremeLearningMachine { 
    public ExtremeLearningMachine() 
    { 

    } 
    int input, hidden; //only have 1 output neuron 
    double[,] W1, W2; 
    public ExtremeLearningMachine(int inputNeuron, int hiddenNeuron) { input = inputNeuron; hidden = hiddenNeuron; } 
    public void train(int dataCount, double[,] trainingSet) { 
     //set matrix 
     double[,] trainInput = new double[input, dataCount], desireOutput = new double[1, dataCount]; 
     for (int i = 0; i < dataCount; i++) { 
      for (int j = 0; j < input; j++) trainInput[j, i] = trainingSet[i, j]; 
      desireOutput[0, i] = trainingSet[i, input]; 
     } 
     //W1 
     W1 = new double[hidden, input]; 
     for (int i = 0; i < hidden; i++) { for (int j = 0; j < input; j++)W1[i, j] = Random.value; } 
     //hidden 
     //double[,] H = new double[hidden, dataCount]; 
     double[,] H = Matrix.Multiply(W1, trainInput); 
     //activation function(binary sigmoid) 
     for (int i = 0; i < hidden; i++) { 
      for (int j = 0; j < dataCount; j++) H[i, j] = 1f/(1f + Mathf.Exp((float)-H[i, j])); 
     } 
     //W2 
     W2 = Matrix.Multiply(desireOutput, H.PseudoInverse()); 
    } 
    public double test(double[,] set) {//only [~,1] allowed 
     double[,] H = Matrix.Multiply(W1, set.Transpose()); 
     //activation function(binary sigmoid) 
     for (int i = 0; i < hidden; i++) H[i, 0] = 1f/(1f + Mathf.Exp((float)-H[i, 0])); 
     H = Matrix.Multiply(W2, H); 
     return H[0, 0]; 
    } 
} 

А вот мой сохранить код:

void save() 
{ 
    System.Xml.Serialization.XmlSerializer writer = 
     new System.Xml.Serialization.XmlSerializer(typeof(ExtremeLearningMachine)); 

    string path = Directory.GetCurrentDirectory() + "\\ElmTrain.xml"; 
    System.IO.FileStream file = System.IO.File.Create(path); 
    for(int i=0;i<elm.Length;i++) 
    writer.Serialize(file, elm[i]); 
    file.Close(); 
} 

Кроме того, мой код загрузки, в (я еще не проверял его, так как не могу сэкономить):

void load() 
{ 
    System.Xml.Serialization.XmlSerializer reader = 
    new System.Xml.Serialization.XmlSerializer(typeof(ExtremeLearningMachine)); 
    System.IO.StreamReader file = new System.IO.StreamReader("//ElmTrain.xml"); 
    elm = (ExtremeLearningMachine[])reader.Deserialize(file); 
    file.Close(); 
} 

Я также открыт для любой другой идеи, чтобы сохранить этот класс в других машиночитаемых форматах, если это рекомендуется

Большое спасибо

ответ

0

Во-первых, ExtremeLearningMachine не имеет каких-либо публичных членов сериализации, так что да : ожидать, что он будет пустым; XmlSerializerсериализует публичные поля и свойства. Попробуйте добавить публичные свойства, например, в дополнение к вашим приватным полям.

Во-вторых: не сериализуйте несколько фрагментов в один и тот же документ. Вместо этого создайте контейнер и выполните сериализацию. Откровенно говоря, вы могли бы просто использовать ExtremeLearningMachine[] как контейнер, так как у вас уже есть что:

var writer = new XmlSerializer(typeof(ExtremeLearningMachine[])); 
string path = Path.Combine(Directory.GetCurrentDirectory(), "ElmTrain.xml"); 
using(var file = File.Create(path)) { 
    writer.Serialize(file, elm); 
} 

и:

var reader = new XmlSerializer(typeof(ExtremeLearningMachine[])); 
using(var file = File.OpenRead(path)) { 
    elm = (ExtremeLearningMachine[])reader.Deserialize(file); 
} 
+0

Я попытался с помощью своей (я также сделал переменные общедоступными), но теперь это приводит к пустому файлу и исключению: массив не был одномерным массивом. – christantoan

+0

@christantoan справа; поэтому исключение говорит вам, что 'XmlSerializer' является только счастливым сериализации массивов, если они одномерные. У вас есть двумерный массив. Итак ... это говорит вам, в чем проблема. Параметры: 1: сгладить ваши данные (все массивы могут быть векторизованы, пока вы сохраняете размеры); 2: используйте другой сериализатор –

+0

И обратите внимание: я являюсь сильным сторонником создания отдельной модели DTO только для сериализации; ваша модель домена может иметь 2D-массив, а модель DTO может иметь 1D-массив, высоту и ширину (хотя технически хотя бы один из них избыточен, поскольку 1D-массив содержит длину) –

0

При преобразовании попробовать следующий код:

  XmlSerializer serializer = new XmlSerializer(typeof(ExtremeLearningMachine)); 
      MemoryStream memStream = new MemoryStream(); 
      serializer.Serialize(memStream, elm); 
      FileStream file = new FileStream(folderName + "\\ElmTrain.xml", FileMode.Create, FileAccess.ReadWrite);//Provide correct path as foldername 
      memStream.WriteTo(file); 
      file.Close();