【问题标题】:Replacing XML serialization of class member替换类成员的 XML 序列化
【发布时间】:2013-03-16 12:50:21
【问题描述】:

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

【问题讨论】:

    标签: c# xml winforms serialization


    【解决方案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,但我希望你能从这一点开始画图。

    【讨论】:

    • @Pablo 我不知道。我会赞成你的问题,也许它会引起一些注意:)
    【解决方案2】:

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

    查看MSDN了解更多信息。

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

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

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

    【讨论】:

    • 但是我必须手动处理我班级的所有成员?从 MSDN 中不清楚。
    • @Pablo 好吧,就是这个想法。如果您不想指定要序列化的属性;还有另一种方法,您还可以标记属性以在 xml 序列化期间忽略它们。相应地更新了我的答案
    • 我知道我可以忽略,但是在忽略之后我必须用其他几个 XML 元素替换该对象才能重新创建它。 IXmlSerializable 将带我了解 XML 实现细节,例如手动编写元素。我带来了一个示例代码。希望对线索进行一个小的示例修改。
    • 嗯,最初我认为有一种方法可以覆盖我的类中的某些内容,所以当序列化程序开始处理marker 时,我可以给他一些自定义成员...
    • @Pablo 我添加了一个额外的答案来涵盖代码位。那对你有用吗?还是没有涵盖您的问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 2015-07-20
    • 2011-08-10
    • 2016-05-22
    相关资源
    最近更新 更多