【问题标题】:serialise to xml序列化为xml
【发布时间】:2012-10-16 07:58:06
【问题描述】:

我有一个类,我需要将它序列化为 XML,但只有特定的属性,即不是全部。最好的方法是什么?另一种方法是创建属性及其值的字典,然后序列化字典。

【问题讨论】:

  • 我有哪些选择?是否可以使用 XmlSerializer 序列化特定属性?最终目标是将我的对象作为字符串存储在数据库中。

标签: c# .net xml serialization


【解决方案1】:

看看XmlAttributes.XmlIgnore Property。你需要做的就是用[XmlIgnoreAttribute()]装饰你不想序列化的字段

示例类:

// This is the class that will be serialized.  
public class Group
{
   // The GroupName value will be serialized--unless it's overridden. 
   public string GroupName;

   /* This field will be ignored when serialized--unless it's overridden. */
   [XmlIgnoreAttribute]
   public string Comment;
}

【讨论】:

  • 谢谢,我试试看。 XmlSerializer 是否适用于子集合?如果我在父级上调用序列化,它是否也会对子级进行序列化?
  • 是的,没问题.. 试试看,如果遇到问题再问一个问题
【解决方案2】:

上面的答案效果很好。但我不喜欢所有内容都被序列化并且只有指定字段不存在的想法。只是一个不同偏好的情况,真的,我喜欢控制事情的运作方式。

使用 ISerializable,来自 MS 的是:“允许对象控制自己的序列化和反序列化。”和一些反思:

    // Required by ISerializable
    public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        FieldInfo[] fields = this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

        foreach (FieldInfo field in fields)
        {
            if (!IsSerializable(field))
                continue;

            info.AddValue(field.Name, field.GetValue(this));
        }
    }

    protected bool IsSerializable(FieldInfo info)
    {
        object[] attributes = info.GetCustomAttributes(typeof(SerializableProperty), false);

        if (attributes.Length == 0)
            return false;

        return true;
    }

“SerializableProperty”是一个空属性,我放在要序列化的字段上。

至于哪个序列化器,完全取决于你。 XML 很好,因为您可以在之后阅读和编辑它。但是,我选择了 BinaryFormatter,它可以在复杂或大型结构的情况下提供更小的文件大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多