gpt4 book ai didi

c# - XNA 的自动 XNB 序列化支持哪些类型?

转载 作者:行者123 更新时间:2023-12-02 05:26:51 24 4
gpt4 key购买 nike

我已经阅读了 Shawn Harvgreave 的关于自动序列化的博客条目和关于内容管道概述的 MSDN 文章,但我找不到支持的类型列表。

引用 MSDN:

Starting with XNA Game Studio 3.1, the serialization of custom data to the .XNB format is done automatically for simple types that do not have an existing content type writer.

在我尝试使用 System.Collections.Generic 中的 Queue 之前我一直没有遇到问题,我猜它不被自动支持连载。

那么,有这个支持的类型列表吗?如果不支持,我是否需要编写自己的 ContentTypeWriterContentTypeReader

最佳答案

提供兼容类型的完整列表是棘手的——因为序列化程序试图与它以前从未见过的自定义类型兼容。因此,任何兼容类的列表都不可能是详尽无遗的。作为Shawn's blog post说:

By default it will serialize all the public fields and properties of your type (assuming they are not read-only).

但是让我们谈谈集合类。根据上述规则,集合类将无法正确序列化(使用反射时),因为它们的对象集合不是公共(public)属性(也不支持索引器)。

有趣的是,为什么 像这样自动序列化一个集合不是内置功能。集合通常实现 IEnumerable<T> (就像 Queue<T> 那样),它可以被序列化。但那是只读的。没有像 IEnumerable 这样的标准接口(interface)用于写入到集合。所以没有办法自动反序列化它们!

幸运的是,XNA 为以下通用集合类型提供自定义读取器/写入器:

  • 数组
  • List<T>
  • Dictionary<TKey, TValue>

序列化程序在可用时自动使用自定义读取器/写入器。所以如果你想让它处理一个集合类(比如 Queue<T> ),那么你必须创建你自己的 ContentTypeWriterContentTypeReader为了它。幸运的是,这并不太难 - 请参阅下面的未经测试实现。

有关内置类型的完整列表,请参阅 XNB Format规范。同样,这只涵盖了内置 类型。可以通过反射或提供自定义读取器/写入器对来支持其他类型。


class QueueReader<T> : ContentTypeReader<Queue<T>>
{
public override bool CanDeserializeIntoExistingObject { get { return true; } }

protected override Queue<T> Read(ContentReader input, Queue<T> existingInstance)
{
int count = input.ReadInt32();
Queue<T> queue = existingInstance ?? new Queue<T>(count);
for(int i = 0; i < count; i++)
queue.Enqueue(input.ReadObject<T>());
return queue;
}
}

[ContentTypeWriter]
class QueueWriter<T> : ContentTypeWriter<Queue<T>>
{
public override string GetRuntimeReader(TargetPlatform targetPlatform)
{
return typeof(QueueReader<T>).AssemblyQualifiedName;
}

public override bool CanDeserializeIntoExistingObject { get { return true; } }

protected override void Write(ContentWriter output, Queue<T> value)
{
output.Write(value.Count);
foreach(var item in value)
output.WriteObject<T>(item);
}
}

请注意,我对 GetRuntimeReader 的实现这里不处理 targetPlatform 的情况不是Windows。您需要将它们放在正确的程序集中,这样就不会出现依赖性问题。

关于c# - XNA 的自动 XNB 序列化支持哪些类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12964904/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com