.net 使用DataContractResolver序列化接口时过度冗长的XML
到目前为止,我还没有得到答案,所以我把问题大大缩短了 基本上,我尝试用DataContractSerializer序列化接口。但是当使用DataContractResolver执行此操作时,生成的XML非常冗长。我有一个接口IAnimal和一个具体的实现Cat 如果我只是序列化Cat,我会得到XML:.net 使用DataContractResolver序列化接口时过度冗长的XML,.net,datacontractserializer,.net,Datacontractserializer,到目前为止,我还没有得到答案,所以我把问题大大缩短了 基本上,我尝试用DataContractSerializer序列化接口。但是当使用DataContractResolver执行此操作时,生成的XML非常冗长。我有一个接口IAnimal和一个具体的实现Cat 如果我只是序列化Cat,我会得到XML: <Cat xmlns="http://schemas.datacontract.org/2004/07/TestDataContractResolver.Concrete" xmlns:i=
<Cat xmlns="http://schemas.datacontract.org/2004/07/TestDataContractResolver.Concrete" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Species>feline</Species>
<Weight>1</Weight>
</Cat>
您的目标是获取xml吗?还是序列化/反序列化接口构造?我可能可以干净利落地完成这项工作,但使用不同的序列化程序,而不是二进制FORAMTTER/NetDataContractSerializer,它们是cheating@Marc,我还没有对它进行足够深入的研究。我当然对非xml选项持开放态度,但最终我需要支持版本控制问题,使用xml通常更容易。你在想protobuf吗?你读到了我的想法:protobuf也被设计成了一个简单的版本,我到时候会研究它。它可以序列化接口而不需要接口上的属性吗?protobuf net v2可以,是的-但是我需要看一个具体的例子来填补空白,这是您获取xml的目标吗?还是序列化/反序列化接口构造?我可能可以干净利落地完成这项工作,但使用不同的序列化程序,而不是二进制FORAMTTER/NetDataContractSerializer,它们是cheating@Marc,我还没有对它进行足够深入的研究。我当然对非xml选项持开放态度,但最终我需要支持版本控制问题,使用xml通常更容易。你在想protobuf吗?你读到了我的想法:protobuf也被设计成了一个简单的版本,我到时候会研究它。它可以序列化接口而不需要接口上的属性吗?protobuf net v2可以,是的-但是我需要看一个具体的例子来填补空白
<z:anyType i:type="a:TestDataContractResolver.Concrete.Cat" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="TestDataContractResolver.Concrete, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<Species xmlns="http://schemas.datacontract.org/2004/07/TestDataContractResolver.Concrete">feline</Species>
<Weight xmlns="http://schemas.datacontract.org/2004/07/TestDataContractResolver.Concrete">1</Weight>
</z:anyType>
public class ModelDataContractResolver : DataContractResolver
{
public override Type ResolveName(string typeName, string typeNamespace, Type declaredType, DataContractResolver knownTypeResolver)
{
return knownTypeResolver.ResolveName(typeName, typeNamespace, declaredType, null) ?? Type.GetType(typeName + ", " + typeNamespace);
}
public override bool TryResolveType(Type type, Type declaredType, DataContractResolver knownTypeResolver, out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace)
{
if (knownTypeResolver.TryResolveType(type, declaredType, null, out typeName, out typeNamespace))
{
return true;
}
XmlDictionary dictionary = new XmlDictionary();
typeName = dictionary.Add(type.FullName);
typeNamespace = dictionary.Add(type.Assembly.FullName);
return true;
}
}