C#[XmlElement]属性是不是隐式转换Type?

时间:2013-05-18 06:59:43

标签: c# xml xml-serialization implicit-conversion monogame

所以我有一个类,Texture2DProcessor,它继承了IX2Serializable和Implicitly强制转换为Texture2D

public static implicit operator Texture2D(Texture2DProcessor o)
{
    return o.Data;
}
public static implicit operator Texture2DProcessor(Texture2D o)
{
    return o == null ? null : new Texture2DProcessor(o);
}

然后我有一个结构,GunProperties,它包含一个带有XmlElement属性的Texture2D属性,其类型设置为Texture2DProcessor

Texture2D _sideSprite;
[XmlElement(typeof(Texture2DProcessor))]
public Texture2D SideSprite
{
    get { return _sideSprite; }
    set { _sideSprite = value; }
}

我收到以下运行时错误

Cannot serialize member '...GunProperties.SideSprite' of type 'Microsoft.Xna.Framework.Graphics.Texture2D'

为什么XmlSerializer不使用Texture2DProcessor来读写Xml数据?

另外我知道我的ReadXml和WriteXml方法有效,因为这样可以正常使用纹理。

Texture2D texture;
XmlSerializer serializer = new XmlSerializer(typeof(Texture2DProcessor));
serializer.Deserialize(new FileStream(path, FileMode.Open), texture);

我遇到这个麻烦的原因是我正在使用monogame,内容管道非常混乱,特别是对于自定义类型而且除了这个问题,我已经全部工作了。

1 个答案:

答案 0 :(得分:1)

看起来这可能是Mono XmlSerializer限制。我有一个小型测试应用程序,可以在.NET下运行,但不能在Mono 3.0.6下运行。

但这看起来相当简单:

[XmlIgnore]
public Texture2D SideSprite { get; set; }

[XmlElement("SideSprite")]
[EditorBrowsable(EditorBrowsableState.Never)]
public Texture2DProcessor SideSpriteProcessor
{
    get { return SideSprite; }
    set { SideSprite = value; }
}

我的Noda Time项目中存在同样的问题,因为XML序列化与不可变类型不能很好地混合。我已经给了same advice那里很多。

编辑:好的,所以这里有一些 工作的示例代码:

using System;
using System.IO;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;

public class Person
{
    public string Name { get; set; }
}

public class PersonWrapper : IXmlSerializable
{
    public Person Person { get; set; }

    public static implicit operator Person(PersonWrapper wrapper)
    {
        return wrapper == null ? null : wrapper.Person;
    }

    public static implicit operator PersonWrapper(Person person)
    {
        return new PersonWrapper { Person = person };
    }

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        string name = reader.ReadString();
        reader.ReadEndElement();
        Person = new Person { Name = name };
    }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteString(Person.Name);
    }
}

public class Company
{
    [XmlElement(typeof(PersonWrapper))]
    public Person Director { get; set; }

    [XmlElement(typeof(PersonWrapper))]
    public Person Manager { get; set; }
}

class Test
{
    static void Main()
    {
        var serializer = new XmlSerializer(typeof(Company));

        var original = new Company
        {
            Director = new Person { Name = "Holly" },
            Manager = new Person { Name = "Jon" }
        };

        var writer = new StringWriter();
        serializer.Serialize(writer, original);
        Console.WriteLine("XML:");
        Console.WriteLine(writer.ToString());

        var reader = new StringReader(writer.ToString());
        var deserialized = (Company) serializer.Deserialize(reader);

        Console.WriteLine("Deserialized:");
        Console.WriteLine("Director: {0}", deserialized.Director.Name);
        Console.WriteLine("Manager: {0}", deserialized.Manager.Name);
    }
}