2015-04-16 2 views
3

У меня есть класс, который я пытаюсь сериализовать и десериализовать с помощью XMLSerializer. Этот класс выглядит следующим образом:Сохранение значений объектов между XML-сериализацией и десериализацией (C#)

namespace AutoCAD_Adapter 
{ 
    /// <summary> 
    /// Test class meant to be serialized to test serialization methods 
    /// </summary> 
    [Serializable] 
    public class SerializeTest// : ISerializable 
    { 
     #region class variables 
     private int x; 
     private int y; 
     #endregion 

     #region Constructors 
     public SerializeTest(int passedX, int passedY) 
     { 
      this.x = passedX; 
      this.y = passedY; 
     } 

     private SerializeTest() 
     { 

     } 

     #endregion 

     #region Public methods 
     public void setX(int x) 
     { 
      this.x = x; 
     } 

     public int getX() 
     { 
      return this.x; 
     } 

     public void setY(int y) 
     { 
      this.y = y; 
     } 

     public int getY() 
     { 
      return this.y; 
     } 



     #endregion 
    } 
} 

Я в курсе вопроса XMLSerialization с классами, которые не имеют пустые параметров конструктора, которые я имел дело с созданием частного конструктора по умолчанию. Это отметил, вот моя реализация:

public void XMLSave() 
{ 
    SerializeTest input = new SerializeTest(4, 8); //Object to serialize 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     XmlSerializer serializer = new XmlSerializer(st.GetType()); 
     serializer.Serialize(stream, input); 
     stream.Position = 0; 
     SerializeTest output = serializer.Deserialize(stream) as SerializeTest; 
     MessageBox.Show(output.getX() + " " + output.getY(), "Output", MessageBoxButtons.OK); 
    } 
} 

После выполнения, я ожидаю, что MessageBox, чтобы показать значение (4, 8), но вместо этого он показывает (0, 0). Мне нужно иметь возможность сохранять значения объектов во время сериализации, предпочтительно, сохраняя сериализацию XML.

+1

Почему вы используете осуществляемые вручную аксессоры для propreties вместо автоматически генерируемый? Насколько я помню, используя public int X {get; set;} всегда работал с XML-сериализацией. –

+0

Хорошо, я привык к Java ха-ха. спасибо –

+0

Частные члены не сериализованы. Вам не нужен атрибут «Serializable» для 'XmlSerializer'. Почему вы не используете [свойства] (https://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx)? –

ответ

3

Ваши данные не сериализованы, потому что они хранятся частными полями. Сериализованы только публичные члены. Как уже упоминалось в комментариях, вы разработчик Java, поэтому вам нужно взглянуть на properties. С их помощью ваша модель может выглядеть так:

public class SerializeTest 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 

    public SerializeTest(int x, int y) 
    { 
     X = x; 
     Y = y; 
    } 

    public SerializeTest() 
    { 
    } 
} 

Теперь вы можете легко сериализации и десериализации его:

var input = new SerializeTest(4, 8); 

using (var ms = new MemoryStream()) 
{ 
    var serializer = new XmlSerializer(typeof(SerializeTest)); 
    serializer.Serialize(ms, input); 
    ms.Position = 0; 

    var output = serializer.Deserialize(ms) as SerializeTest; 
} 
+0

Идеально, спасибо большое –

Смежные вопросы