如何使用SoapFormatter序列化Entity Framework对象?

时间:2016-03-08 18:37:34

标签: c# entity-framework serialization soap soapformatter

我想序列化一个Entity Framework对象(User)并使用典型的webClient.OpenWrite方法将其发送到php脚本。我不知道它是否是一个好的方法,但我在SOAP对象序列化方面遇到了很多问题。

我的初始“用户”实体如下所示:

[Table("TableUsers")]
public class User
{
    public User()
    {
        Products = new HashSet<Product>();
    }
    public int Id { get; set; }

    [Required]
    [StringLength(4000)]
    [Index(IsUnique = true)]
    public string UserName { get; set; }

    [StringLength(4000)]
    public string UserCookie { get; set; }

    [StringLength(4000)]
    public string CompanyName { get; set; }
    ...
    public virtual ICollection<Product> Products { get; set; }
}

当我尝试将所有这些内容序列化并使用下一段代码将其发送到服务器时:

using (Stream postStream = Client.OpenWrite("http://test.com/analytics.php"))
{
    SoapFormatter formatter = new SoapFormatter();
    formatter.Serialize(postStream, user);
}
  1. 起初我得到了一个未处理的异常告诉我
      

    Soap Serializer不支持序列化通用类型...

  2. 好的,好的。我用 [SoapIgnore] 属性标记了我的Product系列。似乎这个属性不起作用,因为我得到了同样的错误。然后我决定从User类和宾果游戏中删除User Constructor!序列化执行! (好吧,我可以在没有界面的情况下生活)

    <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
    <i2:User_782DCAD431DFFDCAE6D6A91B7338AB23B0463133F84A5181874089B6BAEBDBC5 id="ref-1" xmlns:i2="http://test.com">
    <User_x002B__x003C_Id_x003E_k__BackingField>6</User_x002B__x003C_Id_x003E_k__BackingField>
    <User_x002B__x003C_UserName_x003E_k__BackingField id="ref-3">user@test.com</User_x002B__x003C_UserName_x003E_k__BackingField>...
    
    1. 我想让我的肥皂查询更具可读性,并给它们实名(id name,...)insted(AvitoUser_x002B__x003C_UserName_x003E_k__BackingField)再次,像 [MessageBodyMember(Name =“Name”)]这样的属性不工作我将我的类标记为 [Serializable,MessageContract] ,但仍然没有更改。
    2. 最后,我使用了 [DataContract(Name =“User”] [DataMember(Name =“Name”)] 等属性。结果而不是完整的肥皂信封Fiddler只向我展示了它的一部分!

    3. 这个soapFormatter有什么问题?为什么没有exeptions?我应该如何标记所有这些类和属性来制作漂亮的打印肥皂查询?

1 个答案:

答案 0 :(得分:0)

尝试将此放在您的上下文类中:

public class MyContext : DbContext 
{ 
    public MyContext() 
    { 
        this.Configuration.ProxyCreationEnabled = false; 
    }  
....
}

以下链接包含更多详细信息: https://msdn.microsoft.com/en-us/data/jj592886.aspx