1

我有下面的类使用BinaryFormatter的序列化到一个文件二进制格式化,并与属性,而无需备份领域

FileStream fs = new FileStream("DataFile.dat", FileMode.Create); 
BinaryFormatter formatter = new BinaryFormatter(); 
formatter.Serialize(fs, new TestClass{ItemOne = "ItemOne", ItemTwo = "ItemTwo"}); 
fs.Close(); 

使用此代码时反序列化:

FileStream fs = new FileStream("DataFile.dat", FileMode.Open); 
BinaryFormatter formatter = new BinaryFormatter(); 
TestClass addresses = (TestClass)formatter.Deserialize(fs); 
fs.Close(); 

我得到的一切正常。 不过,现在我需要的类有一些支持字段像这样:

[Serializable] 
public class TestClass 
{ 
    private string _itemTwo; 
    private string _itemOne; 

    public String ItemTwo 
    { 
     get { return _itemTwo; } 
     set { _itemTwo = value; } 
    } 

    public String ItemOne 
    { 
     get { return _itemOne; } 
     set { _itemOne = value; } 
    } 
} 

我的问题是,现在,出于某种原因,从以前的版本反序列化不工作了。我得到的类,但属性留空。
我不能影响序列化过程或前一个类的状态。
我该如何获取文件反序列化到当前类?

+0

我试过你的代码,它工作正常。 BinaryFormatter不会序列化私有字段,但会对后续字段进行序列化属性。您使用的是哪个版本的.NET? – codingadventures

+0

二进制格式化程序不具有版本容差。你将无法离开老的dll。将旧的和新的.dll文件加载到一个新的项目中并编写一个转换器程序。或者可能是旧的dll来获取它给后台字段的名称。 – RadioSpace

+0

@GiovanniCampo我正在使用4.5。我们有这样一个真实的生活问题,我创建了一个模拟它的小程序,并且它不起作用。 – atlanteh

回答

3

如果您尝试序列化TestClass的第一个版本,则后场将由二进制格式化程序自动序列化。自动属性只是语法糖,编译器将它们转换为具有后台字段的普通属性。如果您有ILSpy反编译你的原来的控制台应用程序(或类库),例如,你会看到你的私人领域被声明为:

.field private string '<ItemOne>k__BackingField' 

这是您与产生于支持字段第二个声明的方式不同:

.field private string _itemOne 

做法将在您的TestClass宣布ISerializable接口,并得到包含在类使用信息的原始属性的值SerializationInfo

[Serializable] 
public class TestClass : ISerializable 
{ 
    private string _itemTwo; 
    private string _itemOne; 

    public String ItemTwo 
    { 
     get { return _itemTwo; } 
     set { _itemTwo = value; } 
    } 

    public String ItemOne 
    { 
     get { return _itemOne; } 
     set { _itemOne = value; } 
    } 

    protected TestClass(SerializationInfo info, StreamingContext context) 
    { 
     _itemTwo = info.GetString("<ItemTwo>k__BackingField"); 
     _itemOne = info.GetString("<ItemOne>k__BackingField"); 
    } 

    [SecurityPermissionAttribute(SecurityAction.Demand, 
    SerializationFormatter = true)] 
    public virtual void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     //Add data to your serialization process here 
    } 
} 

所以你告诉BinaryFormatter在反序列化过程中你希望你的后台字段被初始化。

+0

太棒了!有用! thx很多:) – atlanteh

+1

太棒了!请不要忘记加注:-) – codingadventures

+0

我觉得应该有一种方法,如果你看看后端。地狱的方式摆脱捏 – RadioSpace