Bagaimana cara menggunakan file XML sebagai file konten di XNA?

9

Saya memiliki file XML yang mewakili berbagai produsen mobil yang akan tersedia di game saya. File terlihat seperti ini:

<?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>

Saat menambahkannya ke folder konten saya, kompiler mengembalikan kesalahan ini:

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

Bagaimana saya bisa membuat daftar string, memasukkannya ke XML dan membacanya dari XNA?

eflles
sumber
Kode deserialisasi Anda akan berguna di sini.
Tetrad
3
Saya tidak punya kode deserializing. Mungkin di sinilah masalah saya dimulai?
eflles
3
Untuk menjawab pertanyaan Tetrad: mungkin eflles menggunakan XmlImporter, bagian dari Pipeline Konten XNA. Pipeline deserializes XML untuk mengkonversikannya ke file XNB (yang kemudian akan dimuat pada ContentManagersaat runtime).
Andrew Russell

Jawaban:

14

Saya belum mencoba mencari tahu apa yang salah dengan XML Anda - mungkin kekurangan namespace. Tapi ini XML yang benar:

<?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>

Di bawah tenda itu XmlImportermenggunakan IntermediateSerializerkelas. Jadi program kecil seperti berikut ini dapat digunakan untuk menentukan apa XML Anda harus terlihat seperti:

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());

(Anda bahkan dapat mengonversi output menjadi aliran, meneruskannya ke Deserializemetode, dan merekonstruksi objek - hanya untuk menjadi dua kali lipat - yakin itu berfungsi. Juga mungkin perlu menempatkan pengkodean yang tepat di header - misalnya: StringBuilderadalah utf-16 .)

Untuk beberapa informasi mendalam tentang IntermediateSerializer, lihat blog Shawn Hargreaves, dimulai dengan posting ini dan berlanjut melalui arsip sampai Agustus 2008.

Andrew Russell
sumber
1
+1 Rangkaian pos Shawn Hargreaves tentang ini sangat bagus. Cara termudah untuk menghasilkan XML Anda adalah dengan memiliki proyek "LevelEditor" yang memiliki semua kode yang sama, tetapi mereferensikan rakitan Pipa Konten sehingga Anda dapat membuat objek Anda dengan atribut default dalam kode, dan kemudian menyambungkannya ke XML untuk dimuat di aktual Anda proyek game.
michael.bartnett
0

Jika Anda ingin melihat bagaimana melakukannya dengan contoh kode, berikut adalah contoh yang menggunakan xml seperti Anda ingin http://create.msdn.com/en-US/education/catalog/sample/collision

Jika Anda ingin membaca artikel yang menjelaskan apa yang sedang terjadi dan mendapatkan wawasan tentang cara bekerja dengan xml & pemroses konten, buka tautan ini, gulir ke bawah ke bagian serializer menengah dan baca 8 atau 9 artikel di sana. http://www.talula.demon.co.uk/blogindex.html

Steve H.
sumber