1
標準の.NET DataContractSerializerクラスを使用してディクショナリコレクションのシリアライズを行うときに悩まされました。正しく辞書をシリアル化するようだ:辞書シリアライゼーション - 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>
しかし、ファイルからオブジェクトを読み取ろうと、それはそれは、キーと値のペアの配列であることを期待していなかったかのように、それは文句:
SerializationException: Deserializing type 'NodeGameObjectDict'. Expecting state 'EndElement'. Encountered state 'Element' with name 'Id' with namespace 'https://id.unity.com/en/organizations/lucas-cardoso-2534099'
辞書がキーと値のペアを1つしか持たない場合、実際にはうまくいきません。何がありますか?
これは私が使用しているコードです:
[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;
}
}
私はunity3dについて何も知らないが、 "GameObjectData"というxmlに複数の要素がある。 'nodeGameObjectData'に付けられた名前を変更するか、' NodeGameObjectDict'のKeyNameを変更してみてください。 –