如果属性返回类型接口具有嵌套属性返回类型,则 DataContractJsonSerializer

需要序列化为 JSON 字符串并将 JSON 字符串反序列化为对象。


这里是我的课堂流程。


[DataContract]

public class BatchItem_NF : INF

{

    [DataMember]

    public IDebtor Debtor { get; set; }


    [DataMember]

    public IList<IDebtor> AllDebtors

    {

        get

        {

            return _debtors;

        }

    }

}


[DataContract]

public class Debtor : IDebtor

{

    [DataMember]

    public IAddress Address { get; set; }

    [DataMember]

    public string Name { get; set; }

}

[DataContract]

public class Address : IAddress

{

    [DataMember]

    public string Street { get; set; }

    [DataMember]

    public string City { get; set; }

}

这是我试图序列化但不起作用的内容


private string BatchItem_NFSerialization(INF Alldebtors)

{

    Type t = Alldebtors.GetType();

    extraTypes1 = t.GetProperties()

        .Where(p => p.PropertyType.IsInterface)

        .Select(p => p.GetValue(Alldebtors, null).GetType())

        .ToArray();

    using (MemoryStream ms = new MemoryStream())

    {

        DataContractJsonSerializer serializer = new DataContractJsonSerializer(t, extraTypes1);

        serializer.WriteObject(ms, ((BatchItem_NF)Alldebtors));


        retVal = Encoding.Default.GetString(ms.ToArray());

    }

}

它抛出以下错误:输入“地址”,数据合同名称为“地址:http : //schemas.datacontract.org/2004/07/ ”是不期望的。如果您正在使用 DataContractSerializer 或将任何静态未知的类型添加到已知类型列表中,请考虑使用 DataContractResolver - 例如,通过使用 knownTypeAttribute 属性或将它们添加到传递给序列化程序的已知类型列表中


慕神8447489
浏览 207回答 1
1回答

白衣染霜花

您只能获得第一级属性的已知类型。在您的代码中,您只能获取Debtor类型,但您还应该处理此属性以获取Address类型,例如通过递归。private static string BatchItem_NFSerialization(INF Alldebtors){&nbsp; &nbsp; Type t = Alldebtors.GetType();&nbsp; &nbsp; var extraTypes1 = GetKnownTypes(Alldebtors);&nbsp; &nbsp; using (MemoryStream ms = new MemoryStream())&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; DataContractJsonSerializer serializer = new DataContractJsonSerializer(t, extraTypes1);&nbsp; &nbsp; &nbsp; &nbsp; serializer.WriteObject(ms, ((BatchItem_NF)Alldebtors));&nbsp; &nbsp; &nbsp; &nbsp; var retVal = Encoding.Default.GetString(ms.ToArray());&nbsp; &nbsp; &nbsp; &nbsp; return retVal;&nbsp; &nbsp; }}private static IEnumerable<Type> GetKnownTypes(object property){&nbsp; &nbsp; Type t = property.GetType();&nbsp; &nbsp; var extraValues = t.GetProperties()&nbsp; &nbsp; &nbsp; &nbsp; .Where(p => p.PropertyType.IsInterface && !p.PropertyType.IsGenericType)&nbsp; &nbsp; &nbsp; &nbsp; .Select(p => p.GetValue(property, null))&nbsp; &nbsp; &nbsp; &nbsp; .ToArray();&nbsp; &nbsp; var extraTypes = extraValues.SelectMany(GetKnownTypes).ToArray();&nbsp; &nbsp; return extraValues.Select(v => v.GetType()).Concat(extraTypes).ToArray();}
打开App,查看更多内容
随时随地看视频慕课网APP