XmlSerializer:如何允许属性反序列化,然后阻止它序列化?

发布于 2024-09-13 18:28:18 字数 63 浏览 8 评论 0原文

也就是说,我希望我的数据以一种方式进行 - 输入到一个类中,但随后防止它在序列化操作期间保存。最好的方法是什么?

That is, I'd like my data to go one way - feed into a class, but then prevent it from saving out during a serialize operation. What's the best way to go about that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

扛起拖把扫天下 2024-09-20 18:28:18

最简单的方法是序列化一个正确执行 Set 但始终在 Get 上返回固定假值的属性。例如,如果该属性名为 Password,您将创建一个适合上述设计的 SerializedPassword 属性,而不序列化原始属性。

编辑

这是 Ani 的示例,已格式化,但做了一处更改:

[XmlIgnore]
public string Password { get; set; }

[XmlElement("Password")]
public string SerializablePassword
{
  get { return null; }
  set { Password = value; }
}

The simplest way is to serialize a property that does Set correctly but always returns a fixed, fake value on Get. For example, if the property were called Password, you'd create a SerializablePassword property that fits the above design, while not serializing the original.

edit

Here's Ani's sample, formatted, with one change:

[XmlIgnore]
public string Password { get; set; }

[XmlElement("Password")]
public string SerializablePassword
{
  get { return null; }
  set { Password = value; }
}
凶凌 2024-09-20 18:28:18

如果您希望完全控制序列化过程,可以实现接口 可序列化

还要实现特殊的构造函数。

编辑:
我的意思是IXmlSerialized。谢谢约翰。

If you like the full control over the serialization process you can implement the interface ISerializable.

Also implement the special constructor.

EDIT:
I meant IXmlSerializable. Thanks John.

寒江雪… 2024-09-20 18:28:18

好吧,我尝试了 return null; 建议,但它不起作用;它无法反序列化。但是,这里有一个解决方法:

public List<Program> Programs
{
    get
    {
        System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace(true);
        for (int i = 0; i < stackTrace.FrameCount; i++)
        {
            if ("XmlSerializationWriterApplication".Equals(stackTrace.GetFrame(i).GetMethod().ReflectedType.Name))
            {
                return null;
            }
        }
        return programs;
    }
    set { programs = value; }
}

虽然性能可能不是很好,但它会检查 StackTrace 以查看谁调用了 get - 如果是 Serializer/Writer,则不会返回任何内容。

Ok, I tried the return null; suggestion, but it doesn't work; it fails to deserialize. However, here's a workaround:

public List<Program> Programs
{
    get
    {
        System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace(true);
        for (int i = 0; i < stackTrace.FrameCount; i++)
        {
            if ("XmlSerializationWriterApplication".Equals(stackTrace.GetFrame(i).GetMethod().ReflectedType.Name))
            {
                return null;
            }
        }
        return programs;
    }
    set { programs = value; }
}

While probably not very performant, this examines the StackTrace to see who called the get - and if it's the Serializer/Writer, it returns nothing.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文