Jak korzystać z plików XML jako plików zawartości w XNA?

9

Mam plik XML reprezentujący różnych producentów samochodów, który będzie dostępny w mojej grze. Plik wygląda następująco:

<?xml version="1.0" encoding="utf-8" ?>
<XnaContent>
  <Asset Type="List[string]">
    <car>Audi</car>
    <car>BMW</car>
    <car>Nissan</car>
    <car>Volvo</car>
  </Asset>
</XnaContent>

Podczas dodawania go do mojego folderu treści kompilator zwraca ten błąd:

There was an error while deserializing intermediate XML. Cannot find type "List`1"

Jak mogę utworzyć listę ciągów, umieścić ją w XML i odczytać z XNA?

eflles
źródło
Twój kod deserializujący byłby tutaj przydatny.
Tetrad
3
Nie mam kodu deserializującego. Może od tego zaczyna się mój problem?
eflles
3
Aby odpowiedzieć na pytanie Tetrad: prawdopodobnie eflles korzysta z XmlImporterczęści potoku treści XNA. Potok deserializuje XML w celu przekonwertowania go do pliku XNB (który następnie zostanie załadowany ContentManagerw czasie wykonywania).
Andrew Russell

Odpowiedzi:

14

Nie próbowałem dowiedzieć się dokładnie, co jest nie tak z twoim XML - prawdopodobnie jest to brak przestrzeni nazw. Ale oto poprawny XML:

<?xml version="1.0" encoding="utf-8"?>
<XnaContent xmlns:Generic="System.Collections.Generic">
  <Asset Type="Generic:List[string]">
    <Item>Audi</Item>
    <Item>BMW</Item>
    <Item>Nissan</Item>
    <Item>Volvo</Item>
  </Asset>
</XnaContent>

Pod maską XmlImporterwykorzystuje IntermediateSerializerklasę. Tak więc mały program, taki jak poniżej, może być użyty do ustalenia, jak powinien wyglądać Twój XML :

var test = new List<string>(){ "Audi", "BMW", "Nissan", "Volvo" };
var sb = new StringBuilder();
using(XmlWriter writer = XmlWriter.Create(sb))
{
    IntermediateSerializer.Serialize(writer, test, null);
}
Console.Write(sb.ToString());

(Możesz nawet przekonwertować dane wyjściowe na strumień, przekazać je do Deserializemetody i zrekonstruować obiekt - aby mieć podwójną pewność, że działa. Prawdopodobnie warto również umieścić odpowiednie kodowanie w nagłówku - np .: StringBuilderis utf-16 .)

Aby uzyskać szczegółowe informacje na ten temat IntermediateSerializer, zajrzyj na blog Shawna Hargreavesa, zaczynając od tego posta i kontynuując przeglądanie archiwów do sierpnia 2008 roku.

Andrew Russell
źródło
1
+1 seria postów Shawna Hargreavesa na ten temat jest świetna. Najprostszym sposobem na wygenerowanie XML jest posiadanie projektu „LevelEditor”, który ma ten sam kod, ale odwołuje się do zestawów potoków treści, dzięki czemu można tworzyć obiekty z domyślnymi atrybutami w kodzie, a następnie serializować je do formatu XML w celu załadowania do rzeczywistego projekt gry.
michael.bartnett
0

Jeśli chcesz zobaczyć, jak to zrobić za pomocą przykładu kodu, oto przykład, który używa xml tak jak chcesz http://create.msdn.com/en-US/education/catalog/sample/collision

Jeśli chcesz przeczytać artykuły wyjaśniające, co się dzieje i uzyskać wgląd w pracę z xml i procesorem treści, przejdź do tego linku, przewiń w dół do sekcji pośredniego serializatora i przeczytaj 8 lub 9 artykułów. http://www.talula.demon.co.uk/blogindex.html

Steve H.
źródło