문제

XML 및 사용자 정의 시리얼 라이저를 사용하는 응용 프로그램이 있으며 최근에 Unity 1.2를 사용하여 DI를 추가하여 클래스에서 두 가지 속성을 설정했습니다.

이제 클래스를 직렬화 할 때 Unity에 의해 설정된 속성은 먼저 직렬화 된 다음 다른 모든 속성이 순서대로 이어집니다.

따라서 클래스 속성 2와 3이 Unity에 의해 설정되면 직렬화 된 클래스는 다음 기관에서 나옵니다 : 23145

XMLSerialiser의 경우 XMLELEMENT 속성을 사용하여 주문을 설정할 수 있지만 사용자 정의 시리얼 라이저는 여전히 잘못된 순서로 클래스를 출력하고 고정 된 lenght 형식으로 주문이 중요합니다.

Unity를 사용하면서 수업을 순서대로 시리얼리에 빠뜨리는 방법을 아는 사람이 있습니까?

감사

코드 예제 클래스

 [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>();

나는 사용자 정의 혈청을 수정할 필요가 없으며 현재는 Unity 구성에 속성 1을 추가하여 일부 테스트를 수행 할 수 있습니다.

그러나 내가 알고 싶은 것은 Unity로 채워진 재산이 다른 방법으로 설정된 재산과 다르게 취급되는 이유입니다. (반사, 생성자 또는 속성 세터).

도움이 되었습니까?

해결책

글쎄, 당신의 사용자 정의 일련 라이저는 주문을 어떻게 선택합니까? 그리고이 시리얼 라이저를 제어합니까? 아니면 타사입니까? 설명하는 "2, 3, 1, 4, 5"패턴은 객체가 "속성 백"이 아닌지 궁금해하며, 단순히 설정된 순서대로 데이터를 직렬화하는 것입니다. 고도로 위험한. 속성을 설정하는 순서는 (일반적으로) 중요해서는 안됩니다.

속성에는 정의 된 순서가 없으므로 빌드 간에이 순서에 의존해서는 안됩니다. 이 시스템은 또한 반사 대 소스 코드 대 실제로 어떤 것의 속성 순서를 보장하지 않습니다.

그래서 당신은 어쨌든, 아마도 알파벳순으로 주문을 스스로 정의해야합니다 (그러나 누군가가 추가 할 때 부서지기 쉬운 일입니다. AardvarkCount 속성), 아마도 사용자 정의 속성을 통해.

나는있다 사용자 정의 (이진) 시리얼 라이저, 그리고 일부 시나리오에서 알파벳순을 지원하지만 사용자 정의 속성 접근 방식을 사용합니다. 예를 들어:

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

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

그런 다음 순서 반사가 속성을 주문하는 것은 중요하지 않습니다. Serializer는 항상 주문에서 데이터를 읽거나 씁니다. Foo, Bar.

(그리고 관찰자의 경우 : 예, 위의 예는 WCF / 데이터 계약과 비슷하게 보입니다. Order 속성 세트, 그래서 나도 그것을지지한다; -p)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top