簡體   English   中英

序列化C#對象時如何排除屬性

[英]How to exclude an attribute when serializing C#-object

如何防止屬性被序列化? 我有一個抽象類,該類標記有[Serializable]。 但我不希望將屬性Checksum包含在序列化中。 我怎么做?

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Cryptography;

namespace test
{

    [DataContract]
    [Serializable]
    public abstract class Baseclass
    {
        /// <summary>
        /// The product id.
        /// </summary>
        [DataMember(Name = "productId")]
        public int ProductId { get; set; }

        /// <summary>
        /// The calculated checksum for this object. 
        /// It is calculated using SHA1.
        /// For more information about SHA-1, see https://en.wikipedia.org/wiki/SHA-1
        /// </summary>
        [DataMember(Name = "checksum")]
        public long Checksum
        {
            get
            {
                long tempHash = 0;
                try
                {
                    this.temp = 0;
                    var seraializer = new BinaryFormatter();
                    var sha1 = new SHA1Managed();
                    byte[] buffer;

                    using (var memoryStream = new MemoryStream())
                    {
                        seraializer.Serialize(memoryStream, this);
                        buffer = memoryStream.ToArray();
                    }
                    var bArrayHash = sha1.ComputeHash(buffer);
                    tempHash = Math.Abs(BitConverter.ToInt64(bArrayHash, 0));
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
                return tempHash;
            }
        }
    }
}

我已經嘗試過MSDN( https://msdn.microsoft.com/zh-cn/library/system.nonserializedattribute.aspx )中的以下代碼,但是當我嘗試將其應用於我的代碼時,編譯器說它無效在此聲明類型上,並且僅在“字段”聲明上有效。

// A test object that needs to be serialized.
[Serializable()]        
public class TestSimpleObject  {

    public int member1;
    public string member2;
    public string member3;
    public double member4;

    // A field that is not serialized.
    [NonSerialized()] public string member5; 

    public TestSimpleObject() {

        member1 = 11;
        member2 = "hello";
        member3 = "hello";
        member4 = 3.14159265;
        member5 = "hello world!";
    }


    public void Print() {

        Console.WriteLine("member1 = '{0}'", member1);
        Console.WriteLine("member2 = '{0}'", member2);
        Console.WriteLine("member3 = '{0}'", member3);
        Console.WriteLine("member4 = '{0}'", member4);
        Console.WriteLine("member5 = '{0}'", member5);
    }
}

如果[JsonIgnore]類轉換為JSON對象,則可以使用[XmlIgnore()][JsonIgnore]裝飾屬性,具體取決於所使用的序列化程序

由於BinaryFormatter對字段進行序列化,因此無法正常工作,請參閱如何忽略使用BinaryFormatter進行序列化的屬性?

因此,我認為解決方案是重新設計我的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM