并非专门为此目的而设计,但ISerializationSurrogate 可以提供帮助。
稍后我将编辑并丰富我的答案,但以下内容可以满足您的需求,但无法为嵌套对象实现相同的效果。
这里的 obj 参数是你的类的实例。如果它的值为空,我们只需省略向序列化信息添加一个字段:
public class NullFieldOmittingSurrogate : ISerializationSurrogate
{
void ISerializationSurrogate.GetObjectData(object obj, SerializationInfo info, StreamingContext context)
{
if (obj != null)
{
foreach (FieldInfo field in obj.GetType().GetFields
(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
{
object fieldValue = field.GetValue(obj);
if (fieldValue != null)
{
info.AddValue(field.Name, fieldValue);
}
}
}
}
object ISerializationSurrogate.SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
{
// The deserialization works without the need for this surrogate
throw new NotImplementedException();
}
}
我们需要将这个代理传递给我们的二进制格式化程序,所以这里有一个方法可以将这个和其他必需的信息传递给它:
public static void SerializeObject(object myObjectInstance, Stream destinationStream)
{
SurrogateSelector surrogateSelector = new SurrogateSelector();
surrogateSelector.AddSurrogate
(
myObjectInstance.GetType(),
new StreamingContext(StreamingContextStates.All),
new NullFieldOmittingSurrogate()
);
IFormatter serializer = new BinaryFormatter();
serializer.SurrogateSelector = surrogateSelector;
serializer.Serialize(destinationStream, myObjectInstance);
}
最后,如何使用:(SerClass 是无关紧要的,它是一个有 4 个属性的类,所有类型均为 object,用于单元测试)
public static void Main()
{
MemoryStream memoryStream = new MemoryStream();
SerializeObject
(
new SerClass()
{
Prop2 = 5,
Prop4 = "ABCD",
Nested = new SerClassNested() { Prop1 = 8, Prop3 = "EFGH" }
},
memoryStream
);
SerClass serClass = new BinaryFormatter().Deserialize(memoryStream) as SerClass;
}
希望这会有所帮助。我仍在处理嵌套类类型字段。