1

在我需要序列化的类(相机)中,我有一个成员没有太多序列化手段,我无法修改它的类。但是整个类中只有 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我可以重新创建该对象。

4

2 回答 2

1

如果您不能或不想对您的 GMarker 进行 Xml 序列化,请确保您确实序列化了重建它所需的属性(就像您已经建议的那样)。这样你就可以创建一个带有支持字段的属性来懒惰地重新创建 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,但我希望你能从这一点开始画图。

于 2013-03-16T13:28:01.107 回答
0

通过在你的类中实现IXmlSerializable接口。Camera

查看MSDN了解更多信息。

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

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

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

于 2013-03-16T12:56:23.110 回答