2012-01-24 66 views
1

我想編寫一個通用方法來序列化從我的ITable接口繼承的對象。我也想有一個PropertyInfo []的參數,我可以指定需要使用該對象序列化的屬性。那些不存在的被忽略。有沒有辦法告訴XmlSerialize只序列化列出的屬性?使用PropertyInfo []作爲映射序列化對象到XML

方法簽名:

public static string SerializeToXml<T>(T obj, PropertyInfo[] fields = null) where T : ITable 

如果字段爲空,自動抓取各個領域。

if (fields == null) 
{ 
    Type type = typeof(T); 
    fields = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); 
} 
+0

您可以使用'XmlIgnore'屬性標記屬性來告訴'XmlSerialzier'不要序列化該屬性。我不知道另一種將這些信息傳遞給'XmlSerializer'的方法。 – rsbarro

+0

@rsbarro - 這看起來像他需要XmlSerializer根據PropertyInfo數組中的內容動態忽略屬性。 – Xaisoft

+0

@MarkP - 這個答案應該有所幫助:http://stackoverflow.com/questions/8553828/how-can-i-ignore-properties-according-to-their-value-with-xmlserializer – Xaisoft

回答

1

通常情況下,您可以使用屬性來執行此操作,具體而言,您可以將the [XmlIgnore] attribute添加到不想序列化的屬性(請注意,這是您想要的另一種方式)。

但是既然你想在運行時做到這一點,你可以使用the XmlAttributeOverrides class,你猜對了,在運行時覆蓋屬性。

所以,這樣的事情應該工作:

public static string SerializeToXml<T>(T obj, PropertyInfo[] fields = null) 
    where T : ITable 
{ 
    Type type = typeof(T); 

    IEnumerable<PropertyInfo> ignoredProperties; 

    if (fields == null) 
     ignoredProperties = Enumerable.Empty<PropertyInfo>(); 
    else 
     ignoredProperties = type.GetProperties(
      BindingFlags.Public | BindingFlags.Instance) 
      .Except(fields); 

    var ignoredAttrs = new XmlAttributes { XmlIgnore = true }; 

    var attrOverrides = new XmlAttributeOverrides(); 

    foreach (var ignoredProperty in ignoredProperties) 
     attrOverrides.Add(type, ignoredProperty.Name, ignoredAttrs); 

    var serializer = new XmlSerializer(type, attrOverrides); 

    using (var writer = new StringWriter()) 
    { 
     serializer.Serialize(writer, obj); 
     return writer.ToString(); 
    } 
} 

在一個不相關的音符,我想命名包含屬性fields是非常混亂的參數。

0

爲每個字段聲明一個屬性如:

public bool ShouldSerializeX() 
{ 
    return X != 0; 
} 

當你在田野循環,這取決於如果你想序列化或不是其屬性設置爲true或false。例如,如果您的字段Address不在PropertyInfo中,請將屬性ShouldSerializeAddress設置爲false,並且XmlSerializer應該忽略它。

Check this answer for more info