代码之家  ›  专栏  ›  技术社区  ›  boj

DataContractSerializer跳过OpenAccess版本的值

  •  1
  • boj  · 技术社区  · 17 年前
    2 回复  |  直到 17 年前
        1
  •  2
  •   user47678    17 年前

        2
  •  2
  •   Marc Gravell    17 年前

    听起来像 [DataMember] 针对字段设置(或默认为字段),并绕过懒惰行为。如果你控制了类型,你也许可以添加一个 [OnSerializing]

    如果生成了类型,请查看它是否是 partial class 。如果是这样,您可以添加另一个 分部类 [序列化] 方法在那里。..

    示例(取消注释最后一个块以使其工作):

    using System;
    using System.Runtime.Serialization;
    using System.Xml;
    
    class Program {
        static void Main() {
            using (XmlWriter writer = XmlWriter.Create(Console.Out)) {
                new DataContractSerializer(typeof(Foo))
                    .WriteObject(writer, new Foo());
            }       
        }
    }
    
    [DataContract]
    partial class Foo {
        [DataMember(Name="Bar")]
        private int? bar;
        public int Bar {
            get {
                if (bar == null) bar = 27; // somthing lazy
                return bar.GetValueOrDefault();
            }
            set { bar = value; }
        }
    }
    /* UNCOMMENT THIS
    partial class Foo {
        [OnSerializing]
        private void BeforeSerialize(StreamingContext ctx) {
            int tmp = Bar;
        }
    }
    */