我正在编写进化算法,但在 XML 文件中写入某些项目时遇到问题。我收到的错误是
InvalidOperationException: The type of the argument object 'ExperimentSettings' is not primitive.
这是我正在使用的代码(我遗漏了一些有效但与问题无关的方法):
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
中删除所有变量,留下一个空类,但它仍然不起作用。我完全没有想法,非常感谢任何帮助!
最佳答案
解决了! 在行中
XmlSerializer settingsSerializer = new XmlSerializer(typeof(Creature));
我从我自己的代码中复制粘贴但我忘记更改类,所以要解决这个特定问题我必须以这种方式编辑这一行
XmlSerializer settingsSerializer = new XmlSerializer(typeof(ExperimentSettings));
关于c# - 序列化问题(参数对象的类型不是原始类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48242046/