簡體   English   中英

XML序列化一個類會導致XML空

[英]XML Serializing a Class results Empty XML

我正在嘗試以可讀格式(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();
}

如果建議的話,我也願意采用其他可讀格式保存此類的其他想法

非常感謝你

首先, 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);
}

轉換時嘗試以下代碼:

            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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM