【发布时间】:2018-06-22 20:20:42
【问题描述】:
我正在编写进化算法,但在 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();
}
}
在 Start 函数中,我只是设置了一个按钮,单击该按钮可保存带有一些任意参数的文件。我会把那段代码留在那里,但它与错误无关。
这是序列化时返回错误的类:
[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 中删除所有变量,留下一个空类,但它仍然不起作用。我完全没有想法,非常感谢任何帮助!
【问题讨论】:
-
说真的,minimal reproducible example 会很有帮助。该异常在一行中抛出,仅显示产生该错误的代码及其上下文。
-
@rene 我编辑了代码以尽可能地匹配您提供的文档
-
更改
XmlSerializer settingsSerializer = new XmlSerializer (typeof(ExperimentSettings)); -
@boran 是的,谢谢,我自己才意识到这一点!
标签: c# xml unity3d serialization evolutionary-algorithm