এক্সএমএল সিরিয়ালাইজেশন - নাল মানগুলি লুকান


128

স্ট্যান্ডার্ড .NET এক্সএমএল সিরিয়ালাইজার ব্যবহার করার সময়, আমি সমস্ত নাল মান লুকিয়ে রাখতে পারি এমন কোনও উপায় আছে কি? নীচে আমার ক্লাসের আউটপুট উদাহরণ। যদি নালাগুলি পূর্ণসংখ্যাগুলি শূন্য করতে থাকে তবে আমি আউটপুট করতে চাই না।

বর্তমান এক্সএমএল আউটপুট:

<?xml version="1.0" encoding="utf-8"?>
<myClass>
   <myNullableInt p2:nil="true" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance" />
   <myOtherInt>-1</myOtherInt>
</myClass>

আমি যা চাই:

<?xml version="1.0" encoding="utf-8"?>
<myClass>
   <myOtherInt>-1</myOtherInt>
</myClass>

উত্তর:


255

আপনি সেই প্যাটার্ন দিয়ে একটি ফাংশন তৈরি করতে পারেন ShouldSerialize{PropertyName}যা এক্সএমএসআরশায়ালাইজারকে বলে যে এটি সদস্যকে সিরিয়ালাইজ করা উচিত কিনা।

উদাহরণস্বরূপ, যদি আপনার শ্রেণীর সম্পত্তি বলা হয় তবে MyNullableIntআপনি থাকতে পারেন

public bool ShouldSerializeMyNullableInt() 
{
  return MyNullableInt.HasValue;
}

এখানে একটি সম্পূর্ণ নমুনা

public class Person
{
  public string Name {get;set;}
  public int? Age {get;set;}
  public bool ShouldSerializeAge()
  {
    return Age.HasValue;
  }
}

নিম্নলিখিত কোডের সাথে সিরিয়ালযুক্ত

Person thePerson = new Person(){Name="Chris"};
XmlSerializer xs = new XmlSerializer(typeof(Person));
StringWriter sw = new StringWriter();
xs.Serialize(sw, thePerson);

অনুসরণকারী এক্সএমএলে ফলাফল - লক্ষ্য করুন কোনও বয়স নেই

<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>Chris</Name>
</Person>


7
হোল্ডসরিয়ালাইজ প্যাটার্নটি কেবলমাত্র কাজ করে, যদি সম্পত্তিটি কোনও এক্সএমএলটিব্রিবিউট-অ্যাট্রিবিউট দিয়ে চিহ্নিত না করা হয় (আমি ভেবেছিলাম এটি কাজ করা উচিত, কারণ একটি বৈশিষ্ট্যটি alচ্ছিক হতে পারে, তবে এটি কার্যকর হয় না)।
ম্যাজেজে

@ ম্যাটেজ আকর্ষণীয়, আমি এটি চেষ্টা করিনি। আমিও ধরে নিয়েছিলাম এটি কাজ করবে।
ক্রিস টেলর

@ ক্রিসটেলর হ্যাঁ; আমিও ধরে নিয়েছি। জটিল জিনিসটি ছিল যে এক্সএমএলসিরালাইজার ইনস্ট্যান্সটি ব্যর্থ হয়েছিল (প্রকারটি প্রতিবিম্বিত করার সময় একটি ত্রুটির কারণে) যতক্ষণ না আমি এক্সএমএলঅ্যাট্রিবিউটকে অযোগ্য ইনট-প্রপার্টি থেকে সরিয়ে না ফেলেছি।
ম্যাটজে

2
@ পিয়ারডেলেস্পিনে - ভিজ্যুয়াল স্টুডিও 2015 এবং ততোধিক সময়ের থেকে আপনি ব্যবহার করতে পারেন: পাবলিক বুল হোল্ডসরিয়ালাইজ () => বয়স.হ্যাসওয়ালু;
রুইউইলি

34

ক্রিস টেলর যা লিখেছিলেন তা ছাড়াও: আপনার যদি কোনও বৈশিষ্ট্য হিসাবে সিরিয়ালযুক্ত কিছু থাকে তবে আপনার শ্রেণিতে কোনও সম্পত্তি {PropertyName}Specifiedএটি সিরিয়াল করা উচিত কিনা তা নিয়ন্ত্রণের জন্য রাখতে পারেন। কোডে:

public class MyClass
{
    [XmlAttribute]
    public int MyValue;

    [XmlIgnore]
    public bool MyValueSpecified;
}

সাবধান থাকুন, {PropertyName}Specifiedবৈশিষ্ট্যগুলি বুল টাইপের হতে হবে।
sinsedrix

30

এটি একটি সম্পত্তি বলা হয় XmlElementAttribute.IsNullable

যদি ইসনুলযোগ্য সম্পত্তিটি সত্য হিসাবে সেট করা থাকে তবে ক্লাস সদস্যদের জন্য শূন্য রেফারেন্সে সেট করা এক্সসিআই: নীল বৈশিষ্ট্য উত্পন্ন হয়।

নিম্নলিখিত উদাহরণটিতে XmlElementAttributeপ্রয়োগ করা ক্ষেত্র এবং ফিল্ডটি ইসনুলযোগ্য হিসাবে মিথ্যাতে সেট করে shows

public class MyClass
{
   [XmlElement(IsNullable = false)]
   public string Group;
}

XmlElementAttributeসিরিয়ালাইজেশন ইত্যাদিতে নাম পরিবর্তন করতে আপনি অন্যের দিকে নজর রাখতে পারেন etc.


11
দুর্ভাগ্যক্রমে, এটি কেবলমাত্র রেফারেন্স ধরণের জন্য কাজ করে, মান ধরণের বা তাদের নালামযোগ্য অংশগুলির জন্য নয়।
ভিনসেন্ট সেলস

3
@ ভিনসেন্টসেলস সঠিক। এমএসডিএন বলছে: আপনি মান ধরণের হিসাবে টাইপ করা কোনও সদস্যের জন্য ইসনুলযোগ্য সম্পত্তি প্রয়োগ করতে পারবেন না কারণ একটি মান ধরণের নਾਲ থাকতে পারে না। অধিকন্তু, আপনি অযোগ্য মান ধরণের জন্য এই সম্পত্তিটিকে মিথ্যাতে সেট করতে পারবেন না। যখন এই ধরণের প্রকারগুলি শূন্য হয় তখন এগুলি xsi: nil to true সেট করে সিরিয়ালিত করা হবে।
বুভিয়ার

12

আপনি কিছু ডিফল্ট মান নির্ধারণ করতে পারেন এবং এটি ক্ষেত্রগুলিকে ক্রমিকায়িত হতে বাধা দেয়।

    [XmlElement, DefaultValue("")]
    string data;

    [XmlArray, DefaultValue(null)]
    List<string> data;

দুর্ভাগ্যক্রমে, এটি মূল্যহীন মান ধরণের জন্য কাজ করে না
বুবি

2

আমি কোনও নিজস্ব তৈরি হওয়া ট্যাগ সহ আমার নিজস্ব এক্সএমএল তৈরি করতে পছন্দ করি। এর মধ্যে আমি নাল মান সহ নোডগুলি তৈরি করা উপেক্ষা করতে পারি:

public static string ConvertToXML<T>(T objectToConvert)
    {
        XmlDocument doc = new XmlDocument();
        XmlNode root = doc.CreateNode(XmlNodeType.Element, objectToConvert.GetType().Name, string.Empty);
        doc.AppendChild(root);
        XmlNode childNode;

        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
        foreach (PropertyDescriptor prop in properties)
        {
            if (prop.GetValue(objectToConvert) != null)
            {
                childNode = doc.CreateNode(XmlNodeType.Element, prop.Name, string.Empty);
                childNode.InnerText = prop.GetValue(objectToConvert).ToString();
                root.AppendChild(childNode);
            }
        }            

        return doc.OuterXml;
    }

1
private static string ToXml(Person obj)
{
  XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
  namespaces.Add(string.Empty, string.Empty);

  string retval = null;
  if (obj != null)
  {
    StringBuilder sb = new StringBuilder();
    using (XmlWriter writer = XmlWriter.Create(sb, new XmlWriterSettings() { OmitXmlDeclaration = true }))
    {
      new XmlSerializer(obj.GetType()).Serialize(writer, obj,namespaces);
    }
    retval = sb.ToString();
  }
  return retval;
}

1

আমার ক্ষেত্রে naclable ভেরিয়েবল / উপাদানগুলি সব স্ট্রিং টাইপ ছিল। সুতরাং, আমি কেবল একটি চেক সম্পাদন করেছি এবং তাদের স্ট্রিং বরাদ্দ করেছি N এইভাবে আমি অপ্রয়োজনীয় শূন্য এবং এক্সএমএলএন বৈশিষ্ট্যগুলি থেকে মুক্তি পেয়েছি (p3: nil = "true" xMLns: p3 = "http://www.w3.org/2001/XMLSchema-instance)

// Example:

myNullableStringElement = varCarryingValue ?? string.Empty

// OR

myNullableStringElement = myNullableStringElement ?? string.Empty

1
এই সমাধানগুলি খুব সীমাবদ্ধ এবং কেবল স্ট্রিংয়ের সাথে কাজ করে। অন্য ধরণের জন্য খালি স্ট্রিং এখনও একটি মান। কিছু পার্সার বিশিষ্ট সন্ধান করার চেষ্টা করে এবং যদি খুঁজে পাওয়া যায় তবে মানটিকে টার্গেটের ধরণের রূপান্তর করতে চেষ্টা করি। এই জাতীয় পার্সারদের জন্য, অনুপস্থিত গুণাবলীর অর্থ শূন্য এবং যদি কোনও বৈশিষ্ট্য থাকে তবে এর অবশ্যই একটি বৈধ মান থাকতে হবে।
জাফরযৌসফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.