序列化的麻烦(参数对象的类型不是原始的)

时间:2018-01-13 16:48:42

标签: c# xml unity3d serialization evolutionary-algorithm

我正在编写一个进化算法但我在编写XML文件中的某些项目时遇到了麻烦。我收到的错误是

  

InvalidOperationException:参数对象的类型   ' ExperimentSettings'不是原始的。

这是我正在使用的代码(我遗漏了一些有效且无论如何与此问题无关的方法):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

public class SerializerTest : MonoBehaviour {

    public GameObject spawner;

    // Use this for initialization
    void Start () {
        GetComponent<Button>().onClick.AddListener(delegate { Save(false, 0, 50, 5, 5, 50, 5, new Vector3(0, 20, 0), new System.IO.DirectoryInfo("/Experiments/Test #0"), spawner.GetComponent<CreatureGenerator>()); });
    }

    // Use this for initialization
    void Save(
        bool startCreatures,
        int experimentType,
        int totalCreaturesNo,
        int cycles,
        float experimentDuration,
        float survivorsPercentage,
        float probabilityOfMutation,
        Vector3 creaturesStartingPosition,
        DirectoryInfo saveFolder,
        CreatureGenerator generator
        )
    {
        //create file where to save the settings
        string settingsFile = Application.dataPath + saveFolder + "/settings_and_parameters.xml";

        if (File.Exists(settingsFile))
        {
            File.Delete(settingsFile);
        }

        XmlSerializer settingsSerializer = new XmlSerializer(typeof(Creature));
        FileStream settingsStream = new FileStream(settingsFile, FileMode.Create);

        //save the settings
        ExperimentSettings thisExperiment = new ExperimentSettings()
        {
            startCreatures = startCreatures,
            experimentType = experimentType,
            totalCreaturesNo = totalCreaturesNo,
            cycles = cycles,
            experimentDuration = experimentDuration,
            survivorsPercentage = survivorsPercentage,
            probabilityOfMutation = probabilityOfMutation,
            creaturesStartingPosition = creaturesStartingPosition,
            saveFolder = new DirectoryInfo(saveFolder.ToString()),
            experimentScene = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name
        };

        settingsSerializer.Serialize(settingsStream, thisExperiment);

        //close the file
        settingsStream.Close();
    }
}

在“开始”功能中,我只需设置一个按钮,单击该按钮可保存带有一些任意参数的文件。我会把那些代码留在那里,但它与错误不太相关。

这是在序列化时返回错误的类:

[System.Serializable]
public class ExperimentSettings
{
    public bool startCreatures;
    public int experimentType;
    public int totalCreaturesNo;
    public int cycles;
    public float experimentDuration;
    public float survivorsPercentage;
    public float probabilityOfMutation;
    public Vector3 creaturesStartingPosition;
    public DirectoryInfo saveFolder;
    public string experimentScene;
}

令我感到困惑的是,我尝试以同样的方式在同一方法中序列化另一个类,就像它实际工作一样。下一个代码块是正确序列化的类:

[System.Serializable]
public class Creature
{
    public string creaturePrefab;
    public double result;
    public bool passed;
}

我尝试从ExperimentSettings删除所有变量,留下一个空类,但它仍然无法正常工作。我全力以赴,非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

解决! 在行

 XmlSerializer settingsSerializer = new XmlSerializer(typeof(Creature)); 

我从我自己的代码中复制粘贴,但我忘了更改课程,所以要解决这个特殊问题,我必须这样编辑这一行

XmlSerializer settingsSerializer = new XmlSerializer(typeof(ExperimentSettings));