2009-01-07 109 views
2

我有一個應用程序使用XML和自定義序列化程序,並且最近添加了一些使用Unity 1.2的DI在我的類中設置兩個屬性。序列化順序和Unity問題

現在,當我序列化該類時,由Unity設置的屬性首先被序列化,然後依次爲所有其他屬性。

所以,如果類的屬性2和3是由統一設置序列化類出來,在下面orger:23145

對於XmlSerialiser我可以使用的XmlElement屬性來設置的順序,但我自定義的串行器仍以錯誤的順序輸出類,並且以固定的長度格式輸出,因此順序很重要。

是否有人知道一種方法讓我的課順序序列,而仍然使用統一?

感謝

代碼示例 類

[Serializable] 
[DataContract] 
[XmlInclude(typeof(HeaderDocument))] 
public class HeaderDocument 
{ 
    [InjectionConstructor] 
    public HeaderDocument() 
    { 
     DateTimeCreated = DateTime.Now; 
     TransactionId = Guid.NewGuid().ToString(); 
     HasPayload = true; 
    } 

    /// <summary>Gets or sets the service name of the target service.</summary> 
    [DataMember, CopyBookElement("REQUESTED-SERVICE", CopyBookDataType.String, Length = 40)] 
    public string ServiceName { get; set; } 

    /// <summary>Gets or sets the entry application name of the request.</summary> 
    [DataMember, CopyBookElement("CONSUMER-APPLICATION-ID", CopyBookDataType.UnsignedInteger, Length = 3)] 
    public int ApplicationId { get; set; } 

    /// <summary>Gets or sets the quality of service required for the request.</summary> 
    [DataMember, CopyBookElement("QUALITY-OF-SERVICE", CopyBookDataType.String, Length = 1)] 
    public string QualityOfService { get; set; } 

    /// <summary>Gets or sets the transaction identifier.</summary> 
    [DataMember, CopyBookElement("TRANSACTION-ID", CopyBookDataType.String, Length = 36)] 
    public string TransactionId { get; set; } 

    /// <summary>Gets or sets the time the document was created.</summary> 
    public DateTime DateTimeCreated { get; set; } 

    [DataMember, CopyBookElement("HAS-PAYLOAD", CopyBookDataType.Boolean)] 
    public bool HasPayload { get; set; } 
} 

統一配置

<unity> 
<typeAliases /> 
<containers> 
    <container name="TechnicalArchitecture"> 
    <types> 
     <type type="ILogger, ApplicationServices" mapTo="Logger, ApplicationServices" /> 
     <type type="HeaderDocument, ApplicationServices"> 
     <typeConfig extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement, Microsoft.Practices.Unity.Configuration"> 
      <property name="ApplicationId" propertyType="System.Int32"> 
      <value value="19" /> 
      </property> 
      <property name="QualityOfService" propertyType="System.String"> 
      <value value="1" /> 
      </property> 
     </typeConfig> 
     </type> 
    </types> 
    </container> 
</containers> 

當構建HeaderDocument我打電話

HeaderDocument = IOC.Container.Resolve<HeaderDocument>(); 

我不希望修改自定義serilaiser,目前我剛剛將屬性1添加到Unity配置,因此我可以做一些測試。

但我真正想知道的是,爲什麼由Unity填充的屬性與通過任何其他方法設置的屬性的處理方式不同。 (反射,構造器或屬性設置器)。

+0

嗨,代碼樣本的任何機會/片段?我認爲你設置的屬性是簡單的類型 - 如字符串或數字 - 不參考其他對象... – 2009-01-07 07:14:30

回答

1

那麼,您的自定義序列化程序如何選擇訂單?你是否控制這個串行器?還是第三方?你描述的「2,3,1,4,5」模式讓我們想知道你的對象是不是「財產包」,它只是簡單地按照設定的順序對數據進行序列化 - 這將是高度的有風險。您設置屬性的順序不應該(通常)很重要。

屬性沒有定義的順序,您不應該在構建之間依賴此順序。系統也不能保證反射和源代碼的屬性順序與實際上的任何事物相比。

因此,您需要以某種方式自己定義順序,也許按字母順序(但是當有人添加AardvarkCount屬性時這很脆弱),也許是通過自定義屬性。

我有一個custom (binary) serializer,我使用自定義屬性的方法,雖然我支持字母的一些情況。例如:

[ProtoContract] 
public class MyClass { 
    [ProtoMember(1)] 
    public int Foo {get;set;} 

    [ProtoMember(2)] 
    public string Bar {get;set;} 
} 

然後,它不以什麼順序反射級的屬性關係 - 串行總是讀順序FooBar /寫入數據。

(以及細心的:是的,上面的例子看起來很像與Order屬性集WCF /數據的合同,所以我支持過;-p)