首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BinaryFormatter OptionalField和ISerializable

BinaryFormatter OptionalField和ISerializable
EN

Stack Overflow用户
提问于 2015-07-23 16:47:53
回答 1查看 521关注 0票数 0

我创建了一个可序列化的测试对象:

代码语言:javascript
复制
[Serializable]
public class TestObject : ISerializable
{
    public string FirstName;
    public TestObject()
    {
    }

    public TestObject(SerializationInfo info, StreamingContext context)
    {
        FirstName = info.GetString("firstName");
    }

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

然后将其序列化:

代码语言:javascript
复制
var test = new TestObject { FirstName = "John" };
using (var stream = new FileStream(@"c:\temp\test.dat", FileMode.Create, FileAccess.Write))
{
    var formatter = new BinaryFormatter();
    formatter.Serialize(stream, test);
}

我更改了类,使其具有一个OptionalFied,并尝试反序列化旧的序列化对象:

代码语言:javascript
复制
[Serializable]
public class TestObject : ISerializable
{
    public string FirstName;

    [OptionalField]
    public string SecondName;

    public TestObject()
    {
    }

    public TestObject(SerializationInfo info, StreamingContext context)
    {
        FirstName = info.GetString("firstName");
        SecondName = info.GetString("secondName");
    }

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

当我将构造函数更改为读取新的可选字段时,会在"SecondName =info.GetString(“secondName”);“处引发异常:

代码语言:javascript
复制
   using (var stream = new FileStream(@"c:\temp\test1.dat", FileMode.Open, FileAccess.Read))
{
    var formatter = new BinaryFormatter();
    var myInstance = (TestObject)formatter.Deserialize(stream);
}

当您实现OptionalFieldAttribute时,是否真的不支持ISerializable?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-23 16:57:02

对于旧的序列化对象,不会有第二个名称字段,因此它的SerializationEntry就不存在了。

在访问该值之前,需要检查该项是否存在:

代码语言:javascript
复制
    foreach (SerializationEntry entry in info) 
    { 
        switch (entry.Name) 
        { 
            case "firstname": 
                Firstname = (string)entry.Value; 
            break; 
            case "secondname": 
                Secondname = (string)entry.Value;
            break; 
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31593471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档