2016-05-07 6 views
1

У меня возникла проблема с моей проблемой сериализации XML. Я работал над своим проектом, чтобы (de) сериализовать объект, который имеет интерфейс как атрибут. Я знаю, что вы не можете сериализовать интерфейс, и об этом говорит моя ошибка.Сериализовать объект с интерфейсом

Вот пример объекта, который я хочу сохранить в файл:

public class Task 
{ 
    public int id; 
    public string name; 
    public TypeEntree typeEntree; 
    public int idRequired; 
    public string code; 
    public int waitTime; 
    public string nameApp; 
    // ... Constructors (empty and non-empty) and methods ... 
} 

TypeEntree является пустым интерфейсом, это только связать различные объекты и использовать их легко вокруг моего приложения. Например, вот два из объектов, которые использует этот интерфейс:

[Serializable] 
public class Mouse : TypeEntree 
{ 
    public Point point; 
    public IntPtr gaucheOuDroite; 
    public string image; 
    // ... Constructors (empty and non-empty) and methods ... 
} 

[Serializable] 
public class Sequence : TypeEntree 
{ 
    public List<Tuple<string, Point, long, IntPtr>> actions; 
    // ... Constructors (empty and non-empty) and methods ... 
} 

Интерфейс TypeEntree также имеет [Serializable] атрибут, а также [XmlInclude (TypeOf (мышь)] для каждого из моих классов, которые использует этот . интерфейс

Вот мой вопрос: Почему когда я пытаюсь сериализации, он может не определяет тип моего объекта (typeEntree в задаче), так как я добавил [XmlInclude (TypeOf (мышь)] атрибуты

?

Также, как я должен исправить эту проблему?

Additionnally, вот методы сериализации/десериализации Я обнаружил, что, кажется, работает очень хорошо без интерфейса: https://stackoverflow.com/a/22417240/6303528

+0

какой сериализатор вы используете? – rene

+0

В последнем предложении я указываю его. http://stackoverflow.com/a/22417240/6303528 - XML ​​ XmlSerializer –

+0

Сериализатор добавляет атрибуты не для сериализации, а для де-сериализации. Сетевой библиотеке нужны атрибуты при десериализации для различения унаследованных классов. – jdweng

ответ

1

Благодаря @dbc ссылки в комментариях моих первых вопросов, я был в состоянии выяснить, каждая проблема. Вот что я сделал:

Мой интерфейс TypeEntree стал абстрактным классом.

[Serializable] 
[XmlInclude(typeof(Mouse))] 
[XmlInclude(typeof(Keyboard))] 
[XmlInclude(typeof(Sequence))] 
public abstract class TypeEntree 
{ 
} 

Кроме того, класс Mouse имел IntPtr, который не является сериализуемым. Мне пришлось преобразовать его в Int64 (длинный). Источник является как из комментариев @dbc, так и здесь: Serialize an IntPtr using XmlSerializer

И, наконец, кортеж не может быть сериализован, поскольку он не имеет конструктора без параметров. Исправление этого просто изменить тип кортежей к классу я создал (TupleModifier) ​​после этого примера: https://stackoverflow.com/a/13739409/6303528

public class TupleModifier<T1, T2, T3, T4> 
{ 
    public T1 Item1 { get; set; } 
    public T2 Item2 { get; set; } 
    public T3 Item3 { get; set; } 
    public T4 Item4 { get; set; } 

    public TupleModifier() { } 

    public static implicit operator TupleModifier<T1, T2, T3, T4>(Tuple<T1, T2, T3, T4> t) 
    { 
     return new TupleModifier<T1, T2, T3, T4>() 
     { 
      Item1 = t.Item1, 
      Item2 = t.Item2, 
      Item3 = t.Item3, 
      Item4 = t.Item4 
     }; 
    } 

    public static implicit operator Tuple<T1, T2, T3, T4>(TupleModifier<T1, T2, T3, T4> t) 
    { 
     return Tuple.Create(t.Item1, t.Item2, t.Item3, t.Item4); 
    } 
} 

и использовать его в классе последовательности, как он был использован:

public List<TupleModifier<string, Point, long, long>> actions; 
Смежные вопросы