سؤال

ولدي تطبيق يستخدم XML والعرف serialiser، ومؤخرا بإضافة بعض DI باستخدام الوحدة 1.2 لتحديد خاصيتين في صفي.

والآن عندما serialise الطبقة وتسلسل جاءت أولا الخصائص التي تم تعيينها بواسطة الوحدة من قبل جميع خصائص أخرى في النظام.

وحتى إذا تم تعيين خصائص الطبقة 2 و 3 من الوحدة الطبقة المتسلسلة يخرج في orger التالية: 23145

لوXmlSerialiser يمكنني استخدام السمة XmlElement لضبط النظام، ولكن بلدي serialiser العرف لا يزال إخراج الفئة في الترتيب غير صحيح، وفي شكل طول ثابت ذلك أمر مهم.

هل هناك أي واحد يعرف من وسيلة للحصول صفي إجراء تسلسل في النظام في حين لا تزال تستخدم الوحدة؟

والشكر

والأمثلة كود الطبقة

 [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 إلى تكوين الوحدة في الوقت الراهن حتى أتمكن من القيام ببعض التجارب.

ولكن ما أريد حقا أن أعرف السبب يتم التعامل مع الممتلكات التي يسكنها الوحدة بشكل مختلف إلى خاصية تحديد بأي طريقة أخرى. (التأمل، منشئ أو اضع الملكية).

هل كانت مفيدة؟

المحلول

حسنا، كيف مسلسل العرف الخاص بك اختيار النظام؟ وهل السيطرة على هذا مسلسل؟ أم أنها 3rd الطرف؟ نمط "2، 3، 1، 4، 5" تصفون يجعل نتساءل إذا جوه الخاص بك ليست "مجموعة خصائص"، وأنها مجرد تسلسل البيانات في النظام تم تعيينها - وهذا سيكون <م> عالية محفوفة بالمخاطر. الترتيب الذي قمت بتعيين خصائص يجب أن لا (عادة) المسألة.

وخصائص لا تملك أمر محددة، ويجب أن لا تعتمد على هذا النظام بين يبني. النظام أيضا لا تقدم أي ضمان إعادة ترتيب الخصائص من انعكاس مقابل الشفرة المصدرية مقابل أي شيء في الواقع.

ولذا تحتاج إلى تحديد الترتيب نفسك بطريقة ما، ربما أبجديا (ولكن هذا هو هش عندما يضيف شخص خاصية AardvarkCount)، ربما عن طريق سمة مخصصة.

ولدي مخصصة (ثنائي) مسلسل ، وأنا استخدم مخصص السمة النهج، على الرغم من أنني دعم الأبجدي لبعض السيناريوهات. على سبيل المثال:

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

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

وبعد ذلك لا يهم في أي ترتيب أوامر انعكاس خصائص - في مسلسل يقرأ دائما / يكتب البيانات في Foo النظام، Bar

(وبالنسبة للملاحظ: نعم، والمثال أعلاه يتطلع الكثير مثل /-عقود البيانات WCF مع مجموعة الخصائص Order، لذلك أنا أؤيد أن ؛-p جدا)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top