仅在反序列化时设置

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)

Tam*_*ege 9

我不确定我是否理解您的问题但您可以尝试在类中实现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类,以获取有关序列化和反序列化最常见类型的更多信息.