2013-05-18 4 views
2

Так у меня есть класс, Texture2DProcessor, который наследуется IXmlSerializable и неявным бросает и из Texture2DАтрибут C# [XmlElement] не подразумевает листинг типа?

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, который содержит свойство Texture2D с атрибутом XMLElement с типом, установленным в 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' 

почему я s XmlSerializer не использует Texture2DProcessor для чтения и записи данных Xml?

Также я знаю, что мои методы ReadXml и WriteXml работают, потому что это работает отлично, и я могу использовать текстуру.

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

Причина я собираюсь через это смятение я использую monogame и трубопровод контента довольно перепутался специально для пользовательских типов и кроме этой проблемы у меня есть все это работает.

ответ

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; } 
} 

У нас есть один и тот же вопрос в моем проекте Нода времени, так как XML сериализация не очень хорошо смешивать с неизменяемыми типами. Я дал довольно много same advice.

EDIT: Хорошо, так вот некоторые примеры кода, которые делает работу:

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); 
    } 
} 
+0

Ничего себе я не думал о том, отдельная собственность для моего textureprocessor. Это «[EditorBrowsable (EditorBrowsableState.Never)]« делает это так, чтобы он не появлялся в интеллекте? –

+0

@ DanielJohnson: Yup. Вы * можете * по-прежнему ссылаться на него из кода, но, надеюсь, люди не будут :) –

+0

Было бы неплохо, если бы у меня был только один атрибут, чтобы перейти на переменную, чтобы он использовал процессор. Он работал в этой [ссылке] (http://stackoverflow.com/questions/20084/xml-serialization-and-inherited-types) –