相关疑难解决方法(0)

DataContractSerializer不调用我的构造函数?

我刚刚意识到一些疯狂的东西,我认为这是完全不可能的:当反序列化一个对象时,DataContractSerializer不会调用构造函数!

以这门课为例,例如:

[DataContract]
public class Book
{
    public Book()
    { // breakpoint here
    }

    [DataMember(Order = 0)]
    public string Title { get; set; }
    [DataMember(Order = 1)]
    public string Author { get; set; }
    [DataMember(Order = 2)]
    public string Summary { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我反序列化该类的对象时,不会触发断点.我完全不知道它是如何可能的,因为它是这个对象的唯一构造函数!

我假设编译器可能因为DataContract属性而生成了额外的构造函数,但我无法通过反射找到它...

所以,我想知道的是:如何在不调用构造函数的情况下创建我的类的实例?

注意:我知道OnDeserializing在反序列化开始时我可以使用该属性初始化我的对象,这不是我的问题的主题.

.net c# serialization constructor datacontractserializer

94
推荐指数
1
解决办法
2万
查看次数

Datacontract例外.无法序列化

我有以下WCF DataContract:

[DataContract]
public class Occupant
{
    private string _Name;
    private string _Email;
    private string _Organization;
    private string _Badge;

    public Occupant(string name, string badge, string organization)
    {
        Name = name;
        Badge = badge;
        Organization = organization;
    }

    public Occupant(string name, string badge)
    {
        Value = name;
        Key = badge;
    }

    [DataMember]
    public string Key
    {
        get { return _Name; }
        set { _Name = value; }
    }

    [DataMember]
    public string Value
    {
        get { return _Badge; }
        set { _Badge …
Run Code Online (Sandbox Code Playgroud)

.net c# wcf

52
推荐指数
3
解决办法
4万
查看次数

WCF DataContract中的构造函数未反映在客户端上

当我在客户端上创建DataContract的实例时,我需要让一些数据成员获得一些值.使用构造函数不会发生这种情况.我搜索了不同的论坛,发现我们必须使用[OnDeserializing]和[OnDeserialized]属性.这也行不通.有人可以在这里提出一些建议.另一种方法是在客户端的部分类中创建构造函数.我想避免这种情况.

请找到以下代码:

服务器端:Datacontract

[DataContract]
public class Account
{

    private int mAccountId;
    private string mAccountName;

    public Account()
    {
        mAccountId = 5;
        mAccountName = "ABC";
    }

    [OnDeserializing]
    public void OnDeserializing(StreamingContext context)
    {
        mAccountId = 5;
        mAccountName = "ABC"; 
    }

    [OnDeserialized]
    public void OnDeserialized(StreamingContext context) 
    {

    } 

    [DataMember]
    public int AccountId
    {
        get
        {
            return mAccountId;
        }
        set
        {
            mAccountId = value;
        }
    }

    [DataMember]
    public string AccountName
    {
        get
        {
            return mAccountName;
        }
        set
        {
            mAccountName = value;
        }
    }


}
Run Code Online (Sandbox Code Playgroud)

客户端 …

wcf datacontract

9
推荐指数
2
解决办法
2万
查看次数