C# 字典序列化--读取DataContractSerializer序列化的对象时出现问题
我在使用标准的.NET DataContractSerializer类对字典集合进行序列化时遇到了一个障碍。它似乎正确地序列化了字典:C# 字典序列化--读取DataContractSerializer序列化的对象时出现问题,c#,.net,unity3d,C#,.net,Unity3d,我在使用标准的.NET DataContractSerializer类对字典集合进行序列化时遇到了一个障碍。它似乎正确地序列化了字典: <GameObjectData xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> <Id> <GameObjectData>ddd95b29-0e98-4f1c-8c0a-ef2815a90f78</Game
<GameObjectData xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<Id>
<GameObjectData>ddd95b29-0e98-4f1c-8c0a-ef2815a90f78</GameObjectData>
<d2p1:Value xmlns:d4p1="https://id.unity.com/en/organizations/lucas-cardoso-2534099">
<X>-4.10677576</X>
<Y>0.05</Y>
<Z>1.01642287</Z>
</d2p1:Value>
</Id>
<Id>
<GameObjectData>7a7b90d6-975d-4166-93a0-f45b4fd0bf51</GameObjectData>
<d2p1:Value xmlns:d4p1="https://id.unity.com/en/organizations/lucas-cardoso-2534099">
<X>0.84188956</X>
<Y>0.05</Y>
<Z>0.09239852</Z>
</d2p1:Value>
</Id>
</GameObjectData>
最糟糕的是,如果字典只有一个键值对,那么它实际上是有效的,因此它肯定遇到了一个障碍,认为它实际上不是数组。有什么好处
这是我正在使用的代码:
[DataContract(Name = "NodeGraphContainer", Namespace = "https://id.unity.com/en/organizations/lucas-cardoso-2534099")]
public class NodeGraphContainer {
...
[DataMember(Name = "GameObjectData")]
public NodeGameObjectDict nodeGameObjectData;
...
}
...
[CollectionDataContract(ItemName = "Id", KeyName = "GameObjectData", Namespace = "https://id.unity.com/en/organizations/lucas-cardoso-2534099")]
public class NodeGameObjectDict : Dictionary<Guid, NodeGameObjectData> { }
实际的答案是Unity没有正确地实现.NET,因此字典类没有被正确地反序列化。一个简短的测试案例证明了这种怀疑。已经报告了错误 实际的答案是Unity没有正确地实现.NET,因此字典类没有被正确地反序列化。一个简短的测试案例证明了这种怀疑。已经报告了错误 我对unity3d一无所知,但您的xml中有多个名为“GameObjectData”的元素。尝试将附加到
nodeGameObjectData
的名称或NodeGameObjectDict
的键名更改为不同的名称。我对unity3d一无所知,但您的xml中有多个名为“GameObjectData”的元素。尝试将附加到nodeGameObjectData
的名称或NodeGameObjectDict
的键名更改为不同。
[DataContract(Name = "NodeGraphContainer", Namespace = "https://id.unity.com/en/organizations/lucas-cardoso-2534099")]
public class NodeGraphContainer {
...
[DataMember(Name = "GameObjectData")]
public NodeGameObjectDict nodeGameObjectData;
...
}
...
[CollectionDataContract(ItemName = "Id", KeyName = "GameObjectData", Namespace = "https://id.unity.com/en/organizations/lucas-cardoso-2534099")]
public class NodeGameObjectDict : Dictionary<Guid, NodeGameObjectData> { }
public void Serialize() {
DataContractSerializer serializer = new DataContractSerializer(typeof(NodeGraphContainer));
XmlWriterSettings settings = new XmlWriterSettings() { Indent = true };
XmlWriter writer = XmlWriter.Create(new FileStream("Assets/Data/maptest.xml", FileMode.Create), settings);
serializer.WriteObject(writer, this);
writer.Close();
}
public static NodeGraphContainer Deserialize() {
DataContractSerializer serializer = new DataContractSerializer(typeof(NodeGraphContainer));
try {
XmlReader reader = XmlDictionaryReader.Create(new FileStream("Assets/Data/maptest.xml", FileMode.Open));
NodeGraphContainer container = (NodeGraphContainer)serializer.ReadObject(reader);
reader.Close();
return container;
} catch (FileNotFoundException ex) {
Debug.Log("No map file found");
return null;
}
}