gpt4 book ai didi

c# - 使用 .NET 自定义序列化时测试可选字段

转载 作者:可可西里 更新时间:2023-11-01 08:22:19 25 4
gpt4 key购买 nike

给定这样一个类:

[Serializable]
public class MyClass {
string name;
string address;

public MyClass(SerializationInfo info, StreamingContext context){
name = info.GetString("name");
if(/* todo: check if a value for address exists */)
address = info.GetString("address");
}

public void GetObjectData(SerializationInfo info, StreamingContext context){
info.AddValue(name);
if(address != null)
info.AddValue(address);
}
}

如何在调用 info.GetString(address) 之前测试 address 字段的值是否存在?

是的,我知道我可以简单地写一个空的 address 字段,但我真正的问题是 MyClass 的早期版本没有地址字段。

注意:我有充分的理由使用自定义序列化。有一些静态字段被用作单例,默认的反序列化不会遵守这一点。

最佳答案

好吧,一个有趣的方法是您可以使用 GetEnumerator (foreach) 迭代名称/值对,使用名称上的 switch 依次处理每个名称/值对?

不过,该实现似乎有点不标准;来自示例 here :

    SerializationInfoEnumerator e = info.GetEnumerator();
Console.WriteLine("Values in the SerializationInfo:");
while (e.MoveNext())
{
Console.WriteLine("Name={0}, ObjectType={1}, Value={2}",
e.Name, e.ObjectType, e.Value);
}

但看起来你也可以使用SerializationEntry:

[Serializable]
class MyData : ISerializable
{
public string Name { get; set; }
public int Value { get; set; }

public MyData() { }
public MyData(SerializationInfo info, StreamingContext context)
{
foreach (SerializationEntry entry in info)
{
switch (entry.Name)
{
case "Name":
Name = (string)entry.Value; break;
case "Value":
Value = (int)entry.Value; break;
}
}
}

public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Name", Name);
info.AddValue("Value", Value);
}
}

关于c# - 使用 .NET 自定义序列化时测试可选字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1333201/

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