反序列化为自我

dot*_*emy 9 c# serialization object

好吧,我可能只是在这里遇到了一个史诗般的失败,但是我想说这应该有用.

假设DataProtect.DecryptData将加密字符串作为输入,将解密后的字符串作为输出.假设deserializeXML生成适当的对象并从新解密的字符串返回它.

所以.为什么这不起作用?

class ArrivedDetails
{
///...

    internal ArrivedDetails(string encrypted)
    {
        this = DataProtect.deserializeXML(DataProtect.DecryptData(encrypted));
    }
///...
Run Code Online (Sandbox Code Playgroud)

给我一个错误

Cannot assign to '<this>' because it's read only
Run Code Online (Sandbox Code Playgroud)

更具体地说,我怎样才能使这个工作?我本质上想要解密对象的XML序列化版本,然后在构造函数中反序列化它.

我愿意接受"你不能"(带有解释),因为我可以把它放在其他地方并且只是分配值,但是我的想法说这样的事情应该是可能的.

Fem*_*ref 16

不,这是不可能使用构造函数,你不能重新分配this.

改为使用静态方法:

public static ArrivedDetails CreateFromString(string encrypted)
{
    return DataProtect.deserializeXML(DataProtect.DecryptData(encrypted));
}
Run Code Online (Sandbox Code Playgroud)

叫它:

ArrivedDetails details = ArrivedDetails.CreateFromString(encrypted);
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以使用反射将其存档,如下所示。

var tmp = DataProtect.deserializeXML(DataProtect.DecryptData(encrypted));
foreach (var property in GetType().GetProperties())
    if (property.GetCustomAttributes(typeof (XmlIgnoreAttribute), false).GetLength(0) == 0)
        property.SetValue(this, property.GetValue(tmp, null), null);
Run Code Online (Sandbox Code Playgroud)

这将反序列化的对象分配给一个时间变量,并this使用反射将每个公共属性中的值复制到。此代码段避免使用 XmlIgnore 属性复制属性。