سؤال

أنا أحاول أن تسلسل كائن XML الذي يحتوي على عدد من الخصائص التي هي للقراءة فقط.

public Guid Id { get; private set; }

لقد شهد الدرجة [Serializable] و لقد نفذت ISerializable واجهة.

أدناه هو رمز أنا باستخدام تسلسل الكائن.

public void SaveMyObject(MyObject obj)
{
    XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
    TextWriter tw = new StreamWriter(_location);
    serializer.Serialize(tw, obj);
    tw.Close();
}

للأسف يقع في السطر الأول مع هذه الرسالة.

InvalidOperationException كان غير معالج:غير قادر على إنشاء فئة مؤقتة (النتيجة=1).خطأ CS0200:مكان الإقامة أو مفهرس 'MyObject.Id' لا يمكن أن تسند إلى-هو قراءة فقط

إذا كنت تعيين الخاصية معرف العامة أنه يعمل بشكل جيد.يمكن أن تقولوا لي إذا أنا أفعل شيئا, أو على الأقل إذا كان ممكنا حتى ؟

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

المحلول

هل يمكن استخدام DataContractSerializer (ولكن لاحظ لا يمكنك استخدام أكس سمات - فقط عناصر XML):

using System;
using System.Runtime.Serialization;
using System.Xml;
[DataContract]
class MyObject {
    public MyObject(Guid id) { this.id = id; }
    [DataMember(Name="Id")]
    private Guid id;
    public Guid Id { get {return id;}}
}
static class Program {
    static void Main() {
        var ser = new DataContractSerializer(typeof(MyObject));
        var obj = new MyObject(Guid.NewGuid());
        using(XmlWriter xw = XmlWriter.Create(Console.Out)) {
            ser.WriteObject(xw, obj);
        }
    }
}

وبدلا من ذلك، يمكنك تنفيذ IXmlSerializable وتفعل كل شيء بنفسك - ولكن هذا يعمل مع XmlSerializer، على الأقل

نصائح أخرى

هل يمكن استخدام System.Runtime.Serialization.NetDataContractSerializer.بل هو أكثر قوة و إصلاح بعض القضايا الكلاسيكية مسلسل Xml.

علما أن هناك سمات مختلفة عن هذا واحد.

[DataContract]
public class X
{
  [DataMember]
  public Guid Id { get; private set; }
}


NetDataContractSerializer serializer = new NetDataContractSerializer();
TextWriter tw = new StreamWriter(_location);
serializer.Serialize(tw, obj);

تحرير:

تحديث على أساس مارك تعليق:ربما يجب عليك استخدام System.Runtime.Serialization.DataContractSerializer بالنسبة للحصول على بيئة نظيفة XML.بقية الكود هو نفسه.

وسوف لا يمكن إجراء تسلسل قراءة الحقول فقط باستخدام XmlSerializer، وهذا يرجع إلى طبيعة الكلمة readonly

ومن MSDN:

<اقتباس فقرة>   

و <م> للقراءة فقط الكلمة هي معدل التي يمكنك استخدامها في الحقول. عندما يتضمن إعلانا الحقل معدل للقراءة فقط، يمكن المهام إلى الحقول التي أدخلتها إعلان تحدث فقط كجزء من الإعلان أو في منشئ في نفس الفئة.

وهكذا ... لو كنت الى حد كبير الحاجة إلى تعيين قيمة الحقول في منشئ افتراضي ...

وليس من الممكن مع ذلك الوضع التسلسل معين (انظر تعليقات أخرى عن الحلول). إذا كنت تريد حقا أن ترك وضع التسلسل الخاص بك كما هو، لديك للتغلب على القيود إطار واحد على هذا. انظر هذا سبيل المثال

وEsentially، بمناسبة public الممتلكات، ولكن بطرح استثناء اذا كان الوصول إليها في أي وقت آخر من إلغاء التسلسل.

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