替换类成员的XML序列化

时间:2013-03-16 12:50:22

标签: c# xml winforms serialization

在我的类(Camera)中,我需要序列化,我有一个没有太多序列化手段的成员,我无法修改它的类。但是全班只有2-3个参数可以序列化,然后根据它进行反序列化。

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是没有序列化方法的成员。但是marker.positionmarker.rotation我可以重新创建该对象。

2 个答案:

答案 0 :(得分: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,但我希望你可以从这一点开始绘制图片。

答案 1 :(得分:0)

IXmlSerializable课程中实施Camera界面。

查看MSDN了解详情。

或者,您可以使用[XmlIgnore]属性标记您不希望序列化为XML的属性。

查看MSDN了解更多信息:)。

PS:如果你发布一些代码,我可以给你看一个例子,但你可能不需要我。如果你这样做,请告诉我。