hmc*_*iii 4 .net c# serialization constructor properties
问题:
我有一个类,比如Foo,它实现了Id属性.Foo必须是可序列化的.Foo.Id应初始化为Foo初始化的新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
Run Code Online (Sandbox Code Playgroud)
或者对于c#ers
private string _Id = system.Guid.NewGuid().ToString();
public string Id {
get { return _Id; }
set { _Id = value; }
}
Run Code Online (Sandbox Code Playgroud)
解决思路:
唯一的解决方案似乎是在设置Foo.Id时抛出运行时异常,但这会在反序列化期间导致问题.因此,不知何故,我们必须确保仅在序列化程序之外进行Set Foo.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;
}
Run Code Online (Sandbox Code Playgroud)
我不确定我是否理解您的问题但您可以尝试在类中实现ISerializable接口以手动微调序列化/反序列化过程.
[Serializable]
public class YourClass : ISerializable
{
private Guid _Id = Guid.NewGuid();
public string Id
{
get { return _Id; }
private set { _Id = value; }
}
public YourClass() // Normal constructor
{
// ...
}
// This constructor is for deserialization only
private YourClass(SerializationInfo information, StreamingContext context)
{
Id = (Guid)information.GetValue("Id", typeof(Guid)); // etc
}
void ISerializable.GetObjectData(SerializationInfo information,
StreamingContext context)
{
// You serialize stuff like this
information.AddValue("Id", Id, typeof(Guid));
}
}
Run Code Online (Sandbox Code Playgroud)
另请阅读SerializationInfo类,以获取有关序列化和反序列化最常见类型的更多信息.
| 归档时间: |
|
| 查看次数: |
3261 次 |
| 最近记录: |