সিরিয়াল একটি nullable int


92

আমি একটি ক্লাস আছে একটি nullable ইন্ট সহ? একটি এক্সএমএল উপাদান হিসাবে সিরিয়ালাইজ করতে ডেটাটাইপ সেট। এটি সেট করার কোনও উপায় আছে যাতে এক্সএমএল সিরিয়ালাইজারটি যদি মূল্য শূন্য হয় তবে উপাদানটি সিরিয়ালায়িত করবে না?

আমি [সিস্টেম.XML.Serialization.XMLElement (isNullable = মিথ্যা)] বৈশিষ্ট্যটি যুক্ত করার চেষ্টা করেছি, তবে আমি রানটাইম সিরিয়াল ব্যতিক্রম পেয়েছি যেখানে টাইপটি প্রতিফলিত করার সময় একটি ত্রুটি ছিল কারণ "ইসনুলযোগ্যটি 'মিথ্যাতে সেট নাও হতে পারে 'একটি নলযোগ্য টাইপের জন্য।

[Serializable]
[System.Xml.Serialization.XmlRoot("Score", Namespace = "http://mycomp.com/test/score/v1")]
public class Score
{
    private int? iID_m;
    ...

    /// <summary>
    /// 
    /// </summary>        
    public int? ID 
    { 
        get 
        { 
            return iID_m; 
        } 
        set 
        { 
            iID_m = value; 
        } 
    }
     ...
}

উপরের শ্রেণিটি এখানে ক্রমিকায়ন করবে:

<Score xmlns="http://mycomp.com/test/score/v1">
    <ID xsi:nil="true" />
</Score>

তবে যে আইডিগুলি নাল হয় আমি তাদের আইডি উপাদানটি মোটেও চাই না, কারণ মূলত যখন আমি এমএসএসকিউএল এ ওপেনএক্সএমএল ব্যবহার করি তখন এটি দেখতে এলিমেন্টের মতো শূন্যের পরিবর্তে 0 দেয়

উত্তর:


150

এক্সএমএসরিশায়ালার ShouldSerialize{Foo}()প্যাটার্ন সমর্থন করে , তাই আপনি একটি পদ্ধতি যুক্ত করতে পারেন:

public bool ShouldSerializeID() {return ID.HasValue;}

রয়েছে {Foo}Specifiedপ্যাটার্ন - নিশ্চিত না যদি XmlSerializer যে এক সমর্থন করে।


8
এক্সএমএলসিরালাইজার এছাড়াও [Foo} নির্দিষ্ট প্যাটার্ন সমর্থন করে।
ডেভিড স্মিট

23
প্রাসঙ্গিক পৃষ্ঠা এখানে: msdn.microsoft.com/en-us/library/53b8022e%28VS.71%29.aspx
CBP

4
অটো-জেনারেটেড প্রোপার্টি সহ হ্যাডসরিয়ালাইজ <প্রপো> ব্যবহার করার কোনও উপায়? অর্থাত্ কোনও স্থানীয় পরিবর্তনশীল নয়।
জে

4
@ জায়ে: একজনের দরকার নেই। আপনি শুধু HasValueসম্পত্তি কল করতে পারেন ।
স্টিভেন সুদিত

4
@ মার্ক যদি, সদস্যের জন্য (সম্পত্তি / ক্ষেত্র) আপনারও Fooএকটি থাকে public bool FooSpecified {get {...} set {...}}, তবে এটি সিরিয়াল করা উচিত getকিনা তা দেখার জন্য ব্যবহৃত হয় Foo, এবং ডিসিরিয়ালেসনের সময় setকোনও মান নির্ধারণের Fooসময় ডাকা হয়।
মার্ক গ্র্যাভেল

26

আমি ন্যারেবল সিরিয়ালাইজেশন প্রয়োগ করতে এই মাইক্রো-প্যাটার্নটি ব্যবহার করছি:

[XmlIgnore]
public double? SomeValue { get; set; }

[XmlAttribute("SomeValue")] // or [XmlElement("SomeValue")]
[EditorBrowsable(EditorBrowsableState.Never)]
public double XmlSomeValue { get { return SomeValue.Value; } set { SomeValue= value; } }  
[EditorBrowsable(EditorBrowsableState.Never)]
public bool XmlSomeValueSpecified { get { return SomeValue.HasValue; } }

এটি আপোস ছাড়াই ব্যবহারকারীর জন্য সঠিক ইন্টারফেস সরবরাহ করে এবং সিরিয়ালকরণের সময় সঠিক কাজটি করে।


4
যেহেতু সামভালিউ নালাগুলি হতে পারে ... সর্বজনীন ডাবল এক্সএমএসসোম্যালু Some পাবেন Some ফিরুন সোমারভ্যালু.হ্যাসভ্যালু? সামভাল্য.ভ্যালু: 0; } সেট {সোমারভ্যালু = মান; }}
ডগ ডোমেনি

এক্সএমএসসোম্যালু কেবলমাত্র এক্সএমএসআরশায়ালাইজার দ্বারা ব্যবহার করা হবে যারা এক্সএমএসসোম্যালু স্পেসিফাইড সত্য হলে (কেবলমাত্র সাম্যভ্যালু.ভ্যালু নাল নয়
ডেভিড শ্মিট

@ পেটিস: এটি এক্সএমএল, আপনি কী আশা করবেন? ;-)
ডেভিড স্মিট

গৃহীত উত্তরটি ২০০৮ সাল থেকে। এটি এখনই এক হওয়া উচিত। জবর উত্তর এর সাথে সম্পর্কিত বনাম ShouldSerialize নির্দিষ্ট
daniloquio

অবশ্যই শীর্ষ উত্তর হতে হবে।
tyteen4a03

12

আমি দুটি বৈশিষ্ট্য ব্যবহার করে একটি কার্যবিধির সন্ধান করেছি। কোন int? একটি এক্সএমএল উপেক্ষা বৈশিষ্ট্য এবং ক্রমিকায়িত হয়ে যায় এমন একটি বস্তুর সম্পত্তি সহ সম্পত্তি।

    /// <summary>
    /// Score db record
    /// </summary>        
    [System.Xml.Serialization.XmlIgnore()]
    public int? ID 
    { 
        get 
        { 
            return iID_m; 
        } 
        set 
        { 
            iID_m = value; 
        } 
    }

    /// <summary>
    /// Score db record
    /// </summary>        
    [System.Xml.Serialization.XmlElement("ID",IsNullable = false)]
    public object IDValue
    {
        get
        {
            return ID;
        }
        set
        {
            if (value == null)
            {
                ID = null;
            }
            else if (value is int || value is int?)
            {
                ID = (int)value;
            }
            else
            {
                ID = int.Parse(value.ToString());
            }
        }
    }

এই সমাধানটি দুর্দান্ত কারণ এটি NULL কে ক্লায়েন্টদের জন্য "স্থানধারক" মান হিসাবে এনকোড করার অনুমতি দেয়, যা ইনটগুলিতে NULLs, অর্থাৎ ফ্লেক্সকে স্বীকৃতি দেয় না।
কুবা ওয়াইরোস্টেক

কোডিং করার সময় আপনি এটি দেখতে পাওয়া xML সিরিয়ালযুক্ত সম্পত্তিতে [সম্পাদকীয় ব্রাউজেবল (সম্পাদক ব্রাউজেবল স্টেট.নাভার)] যুক্ত করতে পারেন
অ্যান্টোনিও রদ্রিগেজ

6

বাহ ধন্যবাদ এই প্রশ্ন / উত্তর আমাকে সত্যিই সাহায্য করেছে। আমি হৃদয় স্ট্যাকওভারফ্লো।

আপনি যা করছেন তা আমি আরও সাধারণের উপরে তৈরি করেছি I আমরা যা খুঁজছি তা হ'ল কিছুটা ভিন্ন সিরিয়ালাইজেশন আচরণের সাথে নুলযোগ্য। আমি আমার নিজের নলেবল তৈরি করতে রিফ্লেক্টরটি ব্যবহার করেছি এবং এক্সএমএল সিরিয়ালাইজেশনটি আমাদের পছন্দ মতো করে তুলতে এখানে এবং সেখানে কয়েকটি জিনিস যুক্ত করেছি। চমত্কার কাজ মনে হয়:

public class Nullable<T>
{
    public Nullable(T value)
    {
        _value = value;
        _hasValue = true;
    }

    public Nullable()
    {
        _hasValue = false;
    }

    [XmlText]
    public T Value
    {
        get
        {
            if (!HasValue)
                throw new InvalidOperationException();
            return _value;
        }
        set
        {
            _value = value;
            _hasValue = true;
        }
    }

    [XmlIgnore]
    public bool HasValue
        { get { return _hasValue; } }

    public T GetValueOrDefault()
        { return _value; }
    public T GetValueOrDefault(T i_defaultValue)
        { return HasValue ? _value : i_defaultValue; }

    public static explicit operator T(Nullable<T> i_value)
        { return i_value.Value; }
    public static implicit operator Nullable<T>(T i_value)
        { return new Nullable<T>(i_value); }

    public override bool Equals(object i_other)
    {
        if (!HasValue)
            return (i_other == null);
        if (i_other == null)
            return false;
        return _value.Equals(i_other);
    }

    public override int GetHashCode()
    {
        if (!HasValue)
            return 0;
        return _value.GetHashCode();
    }

    public override string ToString()
    {
        if (!HasValue)
            return "";
        return _value.ToString();
    }

    bool _hasValue;
    T    _value;
}

আপনি নিজের সদস্যদের অন্তর্ভুক্ত করার ক্ষমতা হারাবেন? এবং এইভাবে (পরিবর্তে নালাম <<> ব্যবহার করতে হবে) তবে এটি ছাড়া অন্য সমস্ত আচরণ একই থাকে।


4
এই ছোঁড়ার System.ExecutionEngineExceptionউপর XmlSerializer.Serializeআমার দিকে।
মার্টিন ব্রাউন

1

দুর্ভাগ্যক্রমে, আপনি যে আচরণগুলি বর্ণনা করেছেন সেগুলি XMLElementAttribute.IsNullable এর জন্য ডক্সে সঠিকভাবে নথিভুক্ত।


1

খুব দরকারী পোস্টিং একটি মহান চুক্তিতে সহায়তা করেছে।

আমি স্কটকে নুলাবল (অফ টি) ডেটাটাইপের সাথে সংশোধন করার সিদ্ধান্ত নিয়েছিলাম, তবে পোস্ট করা কোডটি "এক্সস: নীল = 'সত্য'" বৈশিষ্ট্য ছাড়াই নল - যদিও নল হবে তখন নলের উপাদানটিকে সিরিয়াল করে।

আমাকে সিরিয়ালাইজারকে পুরোপুরি ট্যাগ ফেলে দিতে বাধ্য করা দরকার তাই আমি কাঠামোর উপর কেবলমাত্র আইএক্সএমএলসিরাইজেবল প্রয়োগ করেছি (এটি ভিবিতে রয়েছে তবে আপনি ছবিটি পান):

  '----------------------------------------------------------------------------
  ' GetSchema
  '----------------------------------------------------------------------------
  Public Function GetSchema() As System.Xml.Schema.XmlSchema Implements System.Xml.Serialization.IXmlSerializable.GetSchema
    Return Nothing
  End Function

  '----------------------------------------------------------------------------
  ' ReadXml
  '----------------------------------------------------------------------------
  Public Sub ReadXml(ByVal reader As System.Xml.XmlReader) Implements System.Xml.Serialization.IXmlSerializable.ReadXml
    If (Not reader.IsEmptyElement) Then
      If (reader.Read AndAlso reader.NodeType = System.Xml.XmlNodeType.Text) Then
         Me._value = reader.ReadContentAs(GetType(T), Nothing)
      End If
    End If
  End Sub

  '----------------------------------------------------------------------------
  ' WriteXml
  '----------------------------------------------------------------------------
  Public Sub WriteXml(ByVal writer As System.Xml.XmlWriter) Implements System.Xml.Serialization.IXmlSerializable.WriteXml
    If (_hasValue) Then
      writer.WriteValue(Me.Value)
    End If
  End Sub

আমি এই পদ্ধতিটি (foo) সুনির্দিষ্ট প্যাটার্নটি ব্যবহার করতে পছন্দ করি কারণ এটিতে আমার বস্তুগুলিতে অপ্রয়োজনীয় বৈশিষ্ট্যের বালতি লোড যুক্ত করা প্রয়োজন, যখন নতুন নলযোগ্য প্রকারটি ব্যবহারের জন্য কেবল বৈশিষ্ট্যগুলি পুনর্নির্মাণের প্রয়োজন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.