2017-09-26 11 views
0

アトリビュートのシリアル化を防止するにはどうすればよいですか?私は抽象クラスを持っていて、クラスは[Serializable]とマークされています。しかし、属性Checksumを直列化に含めることは望ましくありません。それ、どうやったら出来るの?私は、MSDN(https://msdn.microsoft.com/en-us/library/system.nonserializedattribute.aspx)から次のコードを試してみましたが、私は自分のコードに適用しようとすると、コンパイラは、それがこの宣言の型に有効ではないと言う、そしてそれは上にのみ有効であることをシリアライズ時に属性を除外する方法C#-object

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; 
      } 
     } 
    } 
} 

フィールド宣言。

// 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); 
    } 
} 
+2

無視するメンバで '[IgnoreDataMember]'属性を使用してください。 –

+0

BinaryFormatterはフィールドをシリアライズするので動作しません(https://stackoverflow.com/questions/27286034/how-to-ignore-a-property-from-being-serialized-using-binaryformatterを参照)。 –

答えて

0

あなたはあなたが見る、にBinaryFormatterは、フィールドをシリアライズするのでそれを動作させるつもりはない

0

を使用しているシリアライザに応じて、JSONオブジェクトにそのクラスを変換する場合は、[XmlIgnore()][JsonIgnore]であなたの財産を飾ることができますHow to Ignore a property from being serialized using BinaryFormatter?

私は解決策が自分のコードを再設計することだと思います。

関連する問題