反序列化为自我

时间:2011-03-22 22:59:50

标签: c# serialization object

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

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

因此。为什么这不起作用?

class ArrivedDetails
{
///...

    internal ArrivedDetails(string encrypted)
    {
        this = DataProtect.deserializeXML(DataProtect.DecryptData(encrypted));
    }
///...

给我一​​个错误

Cannot assign to '<this>' because it's read only

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

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

4 个答案:

答案 0 :(得分:16)

不,使用构造函数是不可能的,您无法重新分配this

改为使用静态方法:

public static ArrivedDetails CreateFromString(string encrypted)
{
    return DataProtect.deserializeXML(DataProtect.DecryptData(encrypted));
}

称之为:

ArrivedDetails details = ArrivedDetails.CreateFromString(encrypted);

答案 1 :(得分:3)

您无法为“this”分配任何内容。将ArriveDetails更改为返回反序列化对象的静态。

class ArrivedDetails
{
    static ArrivedDetails Create(string encrypted)
    { return DataProtect.deserializeXML(...) }
}

答案 2 :(得分:3)

您可以使用反射对此进行归档,如下所示。

A config = 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);

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

答案 3 :(得分:2)

您想要的是一个静态工厂方法,用于创建您需要的对象。

class ArrivedDetails
{
///...

    public static ArrivedDetails CreateFromEncryptedKey(string encrypted)
    {
        return DataProtect.deserializeXML(DataProtect.DecryptData(encrypted));
    }
///...

您的初始方法不起作用的原因是因为this是一个私有的只读实例字段,它返回从中调用它的对象。您无法写信至this