C# 字典序列化--读取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

我在使用标准的.NET DataContractSerializer类对字典集合进行序列化时遇到了一个障碍。它似乎正确地序列化了字典:

<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;
        }
    }