3
protobuf-net을 사용하면 [IgnoreDataMember]
으로 속성을 표시하는 것이 중복됩니까? 또는 전혀 속성이없는 것과 같습니다.Protobuf를 사용하면 [IgnoreDataMember]로 속성을 표시하는 것이 중복됩니까?
protobuf-net을 사용하면 [IgnoreDataMember]
으로 속성을 표시하는 것이 중복됩니까? 또는 전혀 속성이없는 것과 같습니다.Protobuf를 사용하면 [IgnoreDataMember]로 속성을 표시하는 것이 중복됩니까?
protobuf-net에는 불필요한 것으로 보입니다. IgnoreDataMember는 DataContractSerializer에 유용합니다. 기본 동작은 모든 공개 형식을 작성하기 때문입니다. 이 경우 옵트 아웃해야합니다. protobuf-net의 경우 가입해야합니다.
그것은하지 작업하지만, 기본 클래스 멤버를 무시하고
using System;
using System.IO;
using System.Runtime.Serialization;
using ProtoBuf;
namespace ProtoBufTest
{
internal class Program
{
private static void Main(string[] args)
{
var test1 = new Test1() {Value1 = 5, Value2 = 10};
using (var ms = new MemoryStream())
{
Serializer.Serialize(ms, test1);
ms.Position = 0;
var t = Serializer.Deserialize<Test1>(ms);
Console.WriteLine(string.Format("Value written without DataMember: {0}", test1.Value2 == t.Value2));
}
var test2 = new Test2() {Value1 = 5, Value2 = 10};
using (var ms = new MemoryStream())
{
Serializer.Serialize(ms, test2);
ms.Position = 0;
var t = Serializer.Deserialize<Test2>(ms);
Console.WriteLine(string.Format("Value written with IgnoreDataMember: {0}", test2.Value2 == t.Value2));
}
var test3 = new Test3() {Value1 = 5, Value2 = 10};
using (var ms = new MemoryStream())
{
Serializer.Serialize(ms, test3);
ms.Position = 0;
var t = Serializer.Deserialize<Test3>(ms);
Console.WriteLine(string.Format("Value written with DataMember: {0}", test3.Value2 == t.Value2));
}
var test4 = new Test4() { Value1 = 5, Value2 = 10 };
using (var ms = new MemoryStream())
{
Serializer.Serialize(ms, test4);
ms.Position = 0;
var t = Serializer.Deserialize<Test4>(ms);
Console.WriteLine(string.Format("Value written with IgnoreDataMember override: {0}", test4.Value2 == t.Value2));
}
Console.ReadLine();
}
}
[DataContract]
internal class Test1
{
[DataMember(Order = 1)]
public int Value1 { get; set; }
public int Value2 { get; set; }
}
[DataContract]
internal class Test2
{
[DataMember(Order = 1)]
public int Value1 { get; set; }
[IgnoreDataMember]
public int Value2 { get; set; }
}
[DataContract]
[ProtoInclude(3, typeof(Test4))]
internal class Test3
{
[DataMember(Order = 1)]
public int Value1 { get; set; }
[DataMember(Order = 2)]
public int Value2 { get; set; }
}
[DataContract]
internal class Test4 : Test3
{
[IgnoreDataMember]
public new int Value2 { get; set; }
}
}
출력 기본 수준에 포함되는 속성 무시 :
값이 DataMember를없이 작성 : 거짓을
값 IgnoreDataMember로 작성 : False
값은 DataMember로 작성 : True
IgnoreDataMember로 작성된 값 : False