2013-03-16 5 views
1

В моем классе (Camera), который мне нужно для сериализации, у меня есть один член, который не имеет много средств сериализации, и я не могу изменить его класс. Но из всего класса есть только 2-3 параметра, которые можно сериализовать, а затем де-сериализовать на основе этого.Замена сериализации XML члена класса

XmlSerializer SerializerObj = new XmlSerializer(typeof(Camera)); 
TextWriter WriteFileStream = new StreamWriter(@"C:\test.xml"); 
SerializerObj.Serialize(WriteFileStream, cc); 
WriteFileStream.Close(); 

Как и где я могу поместить пользовательский код сериализации, чтобы принять эти параметры из 2-3 объекта и дать сериализатор, а затем во время де-сериализации создать снова этот объект, используя эти 2-3 параметров.

Обновление. Пример кода:

[Serializable()] 
public class Camera 
{ 
    public string name; 
    public int index; 
    public double distance; 
    public List<string> CameraList { get; set; } 

    [XmlIgnore()] 
    public GMarkerGoogle marker; 

    public Camera() 
    { 
    } 

} 

является членом, который не имеет сериализации средства. Но там с marker.position, marker.rotation Я могу воссоздать этот объект.

ответ

1

Если вы не можете или не хотите, чтобы Xml сериализовал ваш GMarker, убедитесь, что вы сериализуете свойства, необходимые для его восстановления (вроде того, что вы уже предложили). Таким образом, вы можете создать свойство с поддержкой поля для ленивого воссоздания GMarker.

[Serializable()] 
public class Camera 
{ 
    public string name; 
    public int index; 
    public double distance; 
    public List<string> CameraList { get; set; } 

    private GMarkerGoogle _marker; 
    [XmlIgnore()] 
    public GMarkerGoogle Marker 
    { 
     set 
     { 
      _marker = value; 
      MarkerPosition = _marker.position; 
      MarkerRotation = _marker.rotation; 
     } 
     get 
     { 
      if (_marker == null) 
      { 
       _marker = new GMarkerGoogle(MarkerPosition, MarkerRotation); 
      } 

      return _marker; 
     } 
    } 

    public double MarkerPosition { get; set; } 
    public double MarkerRotation { get; set; } 

    public Camera() 
    { 
    } 
} 

Помогает ли это? Я придумал кое-что, потому что я не знаю API для маркера, но надеюсь, что вы сможете нарисовать картину с этого момента.

+0

Это помогает, спасибо. Я думаю, что нет лучшего способа ... – Pablo

+0

@Pablo не то, что я знаю. Не стесняйтесь ответить на свой вопрос, может быть, это привлечет внимание :) – bas

0

Внедрение интерфейса IXmlSerializable в вашем классе Camera.

Проверьте, пожалуйста, MSDN.

В качестве альтернативы вы можете использовать атрибут [XmlIgnore], чтобы помечать свойства, которые вы не хотите сериализовать для XML.

Проверить MSDN для получения дополнительной информации :).

PS: Если вы разместите код, я смогу показать вам пример, но вы, вероятно, мне не нужны. Дайте мне знать, если вы это сделаете.

+0

Но с этим я должен обрабатывать всех членов моего класса вручную? Это не ясно из MSDN. – Pablo

+0

Попробуйте и узнайте! : D –

+0

@Pablo Ну да, это идея. Если вы не хотите указывать, какие свойства должны быть сериализованы; существует альтернативный способ, вы также можете отмечать свойства, чтобы игнорировать их во время сериализации XML. обновил мой ответ соответственно – bas

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