15

给定一个像这样的类:

[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);
    }
}

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

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

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

4

2 回答 2

21

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

不过,实现似乎有点不标准;从这里的例子:

    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);
    }
}
于 2009-08-26T08:45:17.707 回答
0

我知道这是一个非常古老的线程,但我对这个问题的解决方案是创建一个SerializationInfo类的扩展方法,如下所示:

namespace System.Runtime.Serialization
{
  public static class SerializationInfoExtensions
  {
    public static bool Exists(this SerializationInfo info, string name)
    {
      foreach (SerializationEntry entry in info)
        if (name == entry.Name)
          return true;
      return false;
    }
  }
}
于 2019-02-27T14:45:55.573 回答