gpt4 book ai didi

protobuf-net - 使用 Protobuf,用 [IgnoreDataMember] 标记属性是否多余?

转载 作者:行者123 更新时间:2023-12-04 04:23:02 26 4
gpt4 key购买 nike

使用 protobuf-net,用 [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 的情况下写入的值:False

用 IgnoreDataMember 写入的值:False

用 DataMember 写入的值:True

使用 IgnoreDataMember 覆盖写入的值:False

关于protobuf-net - 使用 Protobuf,用 [IgnoreDataMember] 标记属性是否多余?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24759734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com