问题:
我有一个类,比如Foo,它实现了一个Id属性。Foo必须是可序列化的。在初始化Foo时,Foo.Id应该初始化为一个新的GUID。一旦设置了foo.id,它就不应该是可更改的。反序列化将尝试设置Foo.id,因此必须将其设置为Public。
Private _Id As String=system.Guid.NewGuid.tostring
Public Property Id As String
Get
return _Id
End Get
Set(ByVal value As String)
_Id = value
End Set
End Property
对于C#
private string _Id = system.Guid.NewGuid().ToString();
public string Id {
get { return _Id; }
set { _Id = value; }
}
解决思路:
唯一的解决方案似乎是在设置Foo.id时抛出一个运行时异常,但这将在反序列化过程中导致问题。因此,我们必须以某种方式确保只有在序列化器外部尝试SetFoo.id时才会引发异常。在构造函数里有什么标志之类的东西吗?
编辑,反序列化方法...
public static Foo DeserializeFromFile(string sFilespec)
{
Xml.Serialization.XmlSerializer oSerializer = new Xml.Serialization.XmlSerializer(typeof(Foo));
System.IO.FileStream oStream = new System.IO.FileStream(sFilespec, IO.FileMode.Open);
Foo oObject = oSerializer.Deserialize(oStream);
oStream.Close();
return oObject;
}
5条答案
按热度按时间3ks5zfa01#
我不确定我是否理解了你的问题,但是你可以尝试在你的类中实现ISerializable接口来手动微调序列化/反序列化过程。
另外,请阅读SerializationInfo类,以获得有关序列化和反序列化最常见类型的更多信息。
zvms9eto2#
根据描述,我假设您正在使用
XmlSerializer
。事实上,XmlSerializer
缺乏这种粒度。它不支持回调(这将允许您检测序列化)等。选项:
IXmlSerializable
-大量的工作(使用XmlReader
/XmlWriter
),并且容易出错...不到万不得已别做DataContractSerializer
,它也支持私有getter/setter或字段,但不支持 full xml控制)-例如,请参见此处我想我会选择DTO它保留了对xml的简单但完整的格式控制,并且没有太多工作。
waxmsbnn3#
首先,我不认为你的代码编译。你需要转换为(Foo)。你还缺少了一个“using”块:
更重要的是,除非您实现IXmlSerializable接口并自己进行反序列化,否则您在这里就不走运了。反序列化Id属性时,可以直接设置_Id字段,而不使用该属性。
yh2wf1be4#
Drjokepu描述的方式似乎是正确的做法。类似地,如果出于任何原因/约束/要求必须使用XmlSerialization,则应该实现IXmlSerializable接口。但是,实现IXmlSerializable可能不如实现ISerializable直观。
在这种情况下,您可能需要尝试以下技巧作为解决方法:)。
1.使Foo.id属性为只读
1.创建一个容器对象Boo。Boo只包含要序列化的相同类型的成员变量。在这个例子中,Boo将拥有Id属性,并带有公共setter和getter。Boo不应该包含Foo拥有的任何成员方法。
1.使用Boo进行XML序列化和反序列化,使用Foo处理业务逻辑。逻辑
请参见下面的示例代码:
muk1a3rh5#
如果只设置一次,您可以添加一个布尔值。