【发布时间】:2015-10-06 20:25:20
【问题描述】:
我有一个包含两个枚举成员的自定义类型。我正在尝试创建此自定义类型的列表,然后将该列表序列化为 XML。当我尝试这样做时,Unity(我在 Unity 工作)崩溃了,这是我以前从未做过的。
我已经从我的序列化代码中将问题缩小到这个范围:
xmls.Serialize(stream, dataCollection);
因此,当 XMLSerializer 尝试序列化我的列表时,就会出现问题。我不知道为什么!所以任何帮助将不胜感激。
代码如下。
XML 序列化代码
public static void WriteGenericCollectionToXML<T>(T dataCollection, string filePath) where T : IEnumerable, ICollection
{
//Check to see if file already exists
if(!File.Exists(filePath))
{
//if not, create it
File.Create(filePath);
}
try
{
XmlSerializer xmls = new XmlSerializer(typeof(T));
using(Stream stream = new FileStream(filePath, FileMode.Append))
{
xmls.Serialize(stream, dataCollection);
}
}
catch(Exception e)
{
Debug.LogException(e);
}
}
创建自定义类型对象列表的代码
public List<BlockType> t = new List<BlockType>();
t.Add(new BlockType(true));
t.Add(new BlockType(true));
t.Add(new BlockType(true));
SaveLoad.WriteGenericCollectionToXML(t, Application.dataPath + "/test.xml");
自定义类型
using UnityEngine;
using System.Collections;
using System.Xml;
using System.Xml.Serialization;
public enum BaseBlockType
{
[XmlEnum(Name = "Animals")]Animals,
[XmlEnum(Name = "Geometry")]Geometry,
[XmlEnum(Name = "Letters")]Letters
}
public enum LetterBlockType
{
[XmlEnum(Name = "A")]A,
[XmlEnum(Name = "B")]B,
[XmlEnum(Name = "C")]C,
[XmlEnum(Name = "D")]Z,
[XmlEnum(Name = "E")]X,
[XmlEnum(Name = "F")]F,
[XmlEnum(Name = "G")]G
}
public enum AnimalType
{
[XmlEnum(Name = "Elephant")]Elephant,
[XmlEnum(Name = "Giraffe")]Giraffe,
[XmlEnum(Name = "Tiger")]Tiger,
[XmlEnum(Name = "Sheep")]Sheep
}
public enum GeometaryType
{
[XmlEnum(Name = "Square")]Square,
[XmlEnum(Name = "Triangle")]Triangle,
[XmlEnum(Name = "Circle")]Circle,
[XmlEnum(Name = "Star")]Star
}
[XmlType]
public class BlockType
{
[XmlAttribute]
public BaseBlockType baseType;
[XmlAttribute]
public System.Enum subType;
public BlockType(BaseBlockType baseT, System.Enum subT)
{
//Set base type
baseType = baseT;
//Set sub type
subType = subT;
//possibly need to perform checks that sub-type is acceptable
}
public BlockType(BaseBlockType baseT)
{
//Set base type
baseType = baseT;
//Set sub type
subType = RandSubType(baseType);
}
public BlockType(bool random)
{
if(random)
{
//Set base type
int enumLength = System.Enum.GetValues(typeof(BaseBlockType)).Length;
int rand = Random.Range(0, enumLength);
baseType = (BaseBlockType)rand;
//Set sub type
subType = RandSubType(baseType);
}
}
public BlockType()
{}
public System.Enum RandSubType(BaseBlockType baseType)
{
int subEnumLength;
int subRand;
switch(baseType)
{
case BaseBlockType.Animals:
subEnumLength = System.Enum.GetValues(typeof(AnimalType)).Length;
subRand = Random.Range(0, subEnumLength);
return (AnimalType)subRand;
case BaseBlockType.Geometry:
subEnumLength = System.Enum.GetValues(typeof(GeometaryType)).Length;
subRand = Random.Range(0, subEnumLength);
return(GeometaryType)subRand;
case BaseBlockType.Letters:
subEnumLength = System.Enum.GetValues(typeof(LetterBlockType)).Length;
subRand = Random.Range(0, subEnumLength);
return (LetterBlockType)subRand;
default:
Debug.Log("Block Sub Type Selection not working");
return null;
}
}
public override string ToString ()
{
string result = baseType.ToString() + "." + subType.ToString();
return result;
}
public override bool Equals (object t)
{
var test = t as BlockType;
if(t == null)
return false;
return(test.baseType == this.baseType && test.subType == this.subType);
}
public override int GetHashCode ()
{
return this.GetHashCode ();
}
}
【问题讨论】:
-
围绕序列化的 try/catch - 它写入的异常是什么?如果没有异常,请在代码的入口点周围放置一个 try/catch 并查看它的内容
-
刚刚尝试将问题行包含在 try catch 中,但它仍然使 Unity 崩溃!很烦人。
-
试试 AppDomain.CurrentDomain.UnhandledException += (s,e)=>Console.WriteLine(e);
-
我敢打赌
System.Enum subType;会窒息,因为System.Enum是抽象的。 -
我认为你是对的。我首先尝试将该成员标记为 {XmlIgnore],但这不起作用 - 仍然崩溃,但我随后将该成员从类中删除并且它起作用了。问题是,我需要那个成员!关于如何解决这个问题的任何想法?我想我可能不得不重新组织我的枚举方式以避免使用 System.Enum。
标签: c# xml serialization enums