السمة غير مضمنة في فئة الوكيل التي تم إنشاؤها

StackOverflow https://stackoverflow.com/questions/159373

  •  03-07-2019
  •  | 
  •  

سؤال

باستخدام .Net 3.0 وVS2005.

يتم استهلاك الكائنات المعنية من خدمة WCF ثم يتم تسلسلها مرة أخرى إلى XML لواجهة برمجة التطبيقات القديمة.لذا بدلاً من إجراء تسلسل لـ TestObject، تم إجراء تسلسل لـ .TestObject الذي كان يفتقد السمة [XmlRoot]؛ومع ذلك، كانت جميع سمات [Xml*] للعناصر الفرعية موجودة في رمز الوكيل الذي تم إنشاؤه، لذا فهي تعمل بشكل جيد.لذلك عملت جميع العناصر الفرعية بشكل جيد، لكن العنصر المتضمن لم يعمل لأن السمة [XmlRoot] لم يتم تضمينها في رمز الوكيل الذي تم إنشاؤه.الكائن الأصلي الذي يتضمن السمة [XmlRoot] يجري تسلسلًا جيدًا يدويًا.

هل يمكنني جعل رمز الوكيل يتضمن السمة [XmlRoot] بحيث يتم إجراء تسلسل لفئة الوكيل التي تم إنشاؤها بشكل صحيح أيضًا؟ إذا لم أتمكن من فعل ذلك، أظن أنني سأضطر إلى استخدام [XmlType] ولكن هذا يسبب ضررًا بسيطًا يتطلب مني تغيير المكونات الأخرى، لذا أفضل الخيار الأول.أريد أيضًا تجنب الاضطرار إلى تحرير فئة الوكيل التي تم إنشاؤها تلقائيًا يدويًا.

فيما يلي بعض نماذج التعليمات البرمجية (لقد قمت بتضمين العميل والخدمة في نفس التطبيق لأن هذا سريع ولأغراض الاختبار.قم بالتعليق على الرمز المرجعي للخدمة وأضف مرجع الخدمة أثناء تشغيل التطبيق، ثم قم بإلغاء التعليق على رمز الخدمة وتشغيله.)

namespace SerializationTest {  
  class Program {  
    static void Main( string[] args ) {  

        Type serviceType = typeof( TestService );  
        using (ServiceHost host = new ServiceHost(   
            serviceType,   
            new Uri[] {   
                new Uri( "http://localhost:8080/" )  
            }  

        ))
        {

            ServiceMetadataBehavior behaviour = new ServiceMetadataBehavior();  
            behaviour.HttpGetEnabled = true;  
            host.Description.Behaviors.Add( behaviour );  

            host.AddServiceEndpoint( serviceType, new BasicHttpBinding(), "TestService" );  
            host.AddServiceEndpoint( typeof( IMetadataExchange ), new BasicHttpBinding(), "MEX" );  


            host.Open();  

            TestServiceClient client = new TestServiceClient();  
            localhost.TestObject to = client.GetObject();  

            String XmlizedString = null;  
            using (MemoryStream memoryStream = new MemoryStream()) {
                XmlSerializer xs = new XmlSerializer( typeof( localhost.TestObject ) );  
                using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream)) {
                    xs.Serialize( xmlWriter, to );  
                    memoryStream = (MemoryStream)xmlWriter.BaseStream;  
                    XmlizedString = Encoding.UTF8.GetString( memoryStream.ToArray() );  
                    Console.WriteLine( XmlizedString );  
                }    
            }    
        }

        Console.ReadKey();  
    }  
}  

[Serializable]  
[XmlRoot( "SomethingElse" )]  
public class TestObject {  

    private bool _worked;  

    public TestObject() { Worked = true; }  

    [XmlAttribute( AttributeName = "AttributeWorked" )]  
    public bool Worked {  
        get { return _worked; }  
        set { _worked = value; }  
    }  
}  

[ServiceContract]  
public class TestService {  

    [OperationContract]  
    [XmlSerializerFormat]  
    public TestObject GetObject() {  
        return new TestObject();  
    }  
  }  
}  

هنا هو ملف Xml الذي ينشئه هذا.

<?xml version="1.0" encoding="utf-8"?>
<TestObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" AttributeWorked="true" /> 
هل كانت مفيدة؟

المحلول

لقد وجدت شخصًا يوفر وسيلة لحل هذا الموقف:

مدونة ماتيفز جاكنيك

باستخدام هذا النهج من XmlAttributeOverrides, ، كتبت ما يلي:

    private static XmlSerializer GetOverridedSerializer()
    {
        // set overrides for TestObject element
        XmlAttributes attrsTestObject = new XmlAttributes();
        XmlRootAttribute rootTestObject = new XmlRootAttribute("SomethingElse");
        attrsTestObject.XmlRoot = rootTestObject;

       // create overrider
       XmlAttributeOverrides xOver = new XmlAttributeOverrides();
       xOver.Add(typeof(localhost.TestObject), attrsTestObject);

       XmlSerializer xSer = new XmlSerializer(typeof(localhost.TestObject), xOver);
       return xSer;
    }

فقط ضع هذه الطريقة في Program فئة المثال الخاص بك، واستبدل السطر التالي في Main():

        //XmlSerializer xs = new XmlSerializer(typeof(localhost.TestObject));
        XmlSerializer xs = GetOverridedSerializer();

ومن ثم تشغيل لرؤية النتائج.

وهنا ما حصلت عليه:

<?xml version="1.0" encoding="utf-8"?><SomethingElse xmlns:xsi="http://www.w3.o
rg/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Attribu
teWorked="true" />

نصائح أخرى

== إذا ==

هذا فقط ل XmlRoot يصف.ال XmlSerializer يحتوي على مُنشئ واحد حيث يمكنك تحديد XmlRoot يصف.

مجد لcsgero لتوجيهه.وينبغي أن يكون تعليقه هو الحل.

XmlSerializer Constructor (Type, XmlRootAttribute)

تهيئة مثيل جديد لـ XmlSerializer الفئة التي يمكنها تخصيص الكائنات من النوع المحدد في مستندات XML ، وتهرب من مستند XML في كائن من النوع المحدد.كما أنه يحدد الفئة لاستخدامها كعنصر جذر XML.

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