Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 包含元素类型';亚型_C#_.net_Serialization_Deserialization_Datacontractjsonserializer - Fatal编程技术网

C# 包含元素类型';亚型

C# 包含元素类型';亚型,c#,.net,serialization,deserialization,datacontractjsonserializer,C#,.net,Serialization,Deserialization,Datacontractjsonserializer,我将使用DataContractJsonSerializer进行JSON序列化/反序列化 我在JSON数组中有两种对象类型,希望它们都被反序列化为相应的对象类型。 具有以下类别定义 [DataContract] public class Post { [DataMember(Name = "content")] public String Content { get; set; } } [DataContract] public class User { [DataMe

我将使用
DataContractJsonSerializer
进行JSON序列化/反序列化

我在JSON数组中有两种对象类型,希望它们都被反序列化为相应的对象类型。 具有以下类别定义

[DataContract]
public class Post {
    [DataMember(Name = "content")]
    public String Content { get; set; }
}

[DataContract]
public class User {
    [DataMember(Name = "user_name")]
    public String UserName { get; set; }
    [DataMember(Name = "email")]
    public String Email { get; set; }
}

[DataContract]
public class Container {
    [DataMember(Name="posts_and_objects")]
    public List<Object> PostsAndUsers { get; set; }
}
[DataContract]
公营职位{
[DataMember(Name=“content”)]
公共字符串内容{get;set;}
}
[数据合同]
公共类用户{
[DataMember(Name=“user\u Name”)]
公共字符串用户名{get;set;}
[DataMember(Name=“email”)]
公共字符串电子邮件{get;set;}
}
[数据合同]
公营货柜{
[DataMember(Name=“posts_和_对象”)]
公共列表PostsAndUsers{get;set;}
}

如何检测它们并将它们反序列化为相应的对象类型并存储在
PostsAndUsers
属性中?

如果您指定了可以序列化和反序列化类容器的已知类型,请尝试以下代码:

protected static Stream GetStream<T>(T content)
{
    MemoryStream memoryStream = new MemoryStream();
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T), new []{typeof(Post), typeof(User)});
    serializer.WriteObject(memoryStream, content);
    memoryStream.Seek(0, SeekOrigin.Begin);
    return memoryStream;
}

protected static T GetObject<T>(Stream stream)
{
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T), new[] { typeof(Post), typeof(User) });
    return (T)serializer.ReadObject(stream);
}

static void Main(string[] args)
{
    var container = new Container {PostsAndUsers = new List<object>()};
    container.PostsAndUsers.Add(new Post{Content = "content1"});
    container.PostsAndUsers.Add(new User{UserName = "username1"});
    container.PostsAndUsers.Add(new Post { Content = "content2" });
    container.PostsAndUsers.Add(new User { UserName = "username2" });

    var stream = GetStream(container);
    var parsedContainer = GetObject<Container>(stream);

    foreach (var postsAndUser in parsedContainer.PostsAndUsers)
    {
        Post post;
        User user;
        if ((post = postsAndUser as Post) != null) 
        {
            // is post
        }
        else if ((user = postsAndUser as User) != null) 
        {
            // is user
        }
        else
        {
            throw new Exception("");
        }
    }
}
受保护的静态流GetStream(T内容)
{
MemoryStream MemoryStream=新的MemoryStream();
DataContractJsonSerializer serializer=newDataContractJsonSerializer(typeof(T),new[]{typeof(Post),typeof(User)});
serializer.WriteObject(memoryStream,content);
memoryStream.Seek(0,SeekOrigin.Begin);
返回内存流;
}
受保护的静态T GetObject(流)
{
DataContractJsonSerializer serializer=newDataContractJsonSerializer(typeof(T),new[]{typeof(Post),typeof(User)});
return(T)serializer.ReadObject(stream);
}
静态void Main(字符串[]参数)
{
var container=new container{PostsAndUsers=new List()};
container.PostsAndUsers.Add(newpost{Content=“content1”});
container.PostsAndUsers.Add(新用户{UserName=“username1”});
container.PostsAndUsers.Add(newpost{Content=“content2”});
container.PostsAndUsers.Add(新用户{UserName=“username2”});
var stream=GetStream(容器);
var parsedContainer=GetObject(流);
foreach(parsedContainer.PostsAndUsers中的var postsAndUser)
{
岗位;
用户;
如果((post=postsAndUser as post)!=null)
{
//是邮政
}
else if((user=postsAndUser as user)!=null)
{
//是用户
}
其他的
{
抛出新异常(“”);
}
}
}

你找到解决方案了吗?@FYaqoob不幸的是,没有。我不得不用JavaScriptSerializer提出一些自定义序列化/反序列化。然而,有人说Newtonsoft.Json是一个好东西,尽管我没有机会使用它。