gpt4 book ai didi

.net 序列化 : how to selectively ignore data fields

转载 作者:行者123 更新时间:2023-12-04 05:36:20 25 4
gpt4 key购买 nike

在。 Net 您可以将字段标记为不可序列化,并且在序列化过程中将被跳过。

我正在寻找一种简单的方法,它允许我在运行时控制是否应该序列化特定字段。

最佳答案

您指的是“将字段标记为不可序列化”,因此我假设您使用的是 BinaryFormatter[NonSerialized] .如果是这样,进行条件序列化的唯一方法是实现 ISerializable并添加一个类似的构造函数,并将逻辑放入GetObjectData实现。但是,这很乏味且容易出错。我建议使用 TypeDescriptor 使用的标准模式查看具有更简单条件序列化的 protobuf-net。和 XmlSerializer ,但仍然是二进制输出(实际上比 BinaryFormatter 更有效)。具体来说:

[ProtoContract]
public class SomeType {
[ProtoMember(1)]
public string Name {get;set;}

private bool ShouldSerializeName() {
// return true to serialize Name, false otherwise
}
}

ShouldSerialize*是基于名称的标准约定 - 没有特定于此序列化程序的内容。

这是相同的通过 ISerializable :
[Serializable]
public class SomeType : ISerializable
{
public SomeType() { }
public string Name { get; set; }


void ISerializable.GetObjectData(
SerializationInfo info, StreamingContext context)
{
if (/* should serialize Name */) info.AddValue("Name", Name);
//... all other fields
}
protected SomeType(SerializationInfo info, StreamingContext context)
{
foreach (SerializationEntry entry in info)
{
switch (entry.Name)
{
case "Name": Name = (string)entry.Value; break;
//... all other fields
}
}
}
}

还有很多需要维护;特别是在使用 ISerializable时要对所有成员(member)负责。 - 但是,如果您只使用 protobuf-net,则可以逐案处理。

实际上,您也可以混合搭配,即如果您坚持使用 BinaryFormatter ,您仍然可以将工作卸载到 protobuf-net,但是 它将改变格式 (因此与旧数据不兼容)。例如:
[Serializable, ProtoContract]
public class SomeType : ISerializable
{
public SomeType() { }
[ProtoMember(1)]
public string Name { get; set; }
private bool ShouldSerializeName() { /* condition */ }

void ISerializable.GetObjectData(
SerializationInfo info, StreamingContext context)
{
Serializer.Serialize(info, this);
}
protected SomeType(SerializationInfo info, StreamingContext context)
{
Serializer.Merge(info, this);
}
}

关于.net 序列化 : how to selectively ignore data fields,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11880666/

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