- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 DataContractSerializer
,我想将同一对象的数据分成多个文件。
[DataContract]
public class TestObj
{
[DataMember]
protected double field1 = 0.0;
[DataMember]
protected double field2 = 0.0;
}
具体来说,我想将 field1
保存在一个 XML 文件中,将 field2
保存在另一个 XML 文件中。有没有办法使用数据契约序列化来做到这一点?
这就是我目前序列化的方式:
DataContractSerializer serializaer = new DataContractSerializer(GetType(), null,
0x7FFFFFFF /*maxItemsInObjectGraph*/,
false /*ignoreExtensionDataObject*/,
true /*preserveObjectReferences : this is most important to me */,
null /*dataContractSurrogate*/);
var fs = File.Open(fName, FileMode.Create);
serializaer.WriteObject(fs, this);
fs.Dispose();
return true;
最佳答案
我可以建议使用与序列化程序配对的自定义 Xml 编写器。
public class CustomWriter : XmlTextWriter
{
public CustomWriter(TextWriter writer) : base(writer) { }
public CustomWriter(Stream stream, Encoding encoding) : base(stream, encoding) { }
public CustomWriter(string filename, Encoding encoding) : base(filename, encoding) { }
public List<string> FieldList { get; set; }
private string _localName;
public override void WriteStartElement(string prefix, string localName, string ns)
{
if (!FieldList.Contains(localName))
base.WriteStartElement(prefix, localName, ns);
else
_localName = localName;
}
public override void WriteString(string text)
{
if (!FieldList.Contains(_localName))
base.WriteString(text);
}
public override void WriteEndElement()
{
if (!FieldList.Contains(_localName))
base.WriteEndElement();
else
_localName = null;
}
}
按如下方式使用:
var data = new TestObj();
var serializer = new DataContractSerializer(
typeof(TestObj), null, 0x7FFFFFFF, false, true, null);
using (var writer = new CustomWriter(Console.Out)) // Specify filename or stream instead
{
writer.Formatting = Formatting.Indented;
writer.FieldList = new List<string> { "field1", "field3" }; // Specify fields to ignore
serializer.WriteObject(writer, data);
}
只需在 FieldList 属性中指定应忽略的字段列表即可。
当然,通过这种方式,DataContractSerializer 将中间创建包含类中所有元素的 xml。只有在那之后,我们的自定义编写器才会过滤它们。但它会即时发生,非常快速有效。
关于c# - 通过序列化 DataContract 将对象字段分离到两个文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58363038/
是否有可能(如果可以,那么如何)从未实现 [DataContract] 的基类继承并告诉序列化程序忽略它? 有点像 //Non-accessible, non-[DataContract] class
问题是我没有得到我想要的 XML 结构。我的代码如下: [DataContract] public class Persons { [DataMember] public List P
下面是我的 WCF DataContract 基类 [DataContract] public class BaseClass { //some datamember
WCF 新手。 DataContact 类可以继承自 Interface 吗? 例如: [DataContract(Namespace = ...........)] public class Ves
我有一个令人沮丧的问题,我一直在努力克服但似乎无法弄清楚。 我有通过 WCF 中的 SOAP 和 REST 端点公开的服务。为了避免重复的对象代码,我想在两个服务之间重用契约(Contract)对象。
好吧,这里什么都没有。在阅读了服务版本控制和数据契约(Contract)版本控制的最佳实践 (http://msdn.microsoft.com/en-us/library/ms733832.aspx
我想知道通过 WCF 服务公开哪些对象有什么意义 - 我应该将 WCF 序列化规范添加到我的业务实体,还是应该实现一个转换器将我的业务实体映射到我想通过我的 WCF 公开的 DataContracts
[DataMember] public int? NumberOfPages; //////////// Is this supported???? [DataMember]
我有一个 ServiceContract,它有一个具有以下方法签名的 OperationContract:Manipulate(int fileid, param object[] Operation
我有一个类(带有属性和一些方法) [DataContract] public partial class AbstractApplicationCallDto { [IgnoreDataMem
我想使用 AJAX 调用来使用 WCF REST 服务。 假设我有以下内容 Person是一个用户定义的类: [ServiceContract] public interface IPerson {
我一直在阅读有关在我的 Silverlight 项目中有一个 [DataContract] 指定类的信息。我知道它们被序列化并传递给客户端以传递信息。 除此之外,您似乎可以在某些情况下向这些类添加代码
基本上我有一个 DataContract,其中包含一个 Dictionary: [DataContract] public class MyDictionary : IDictionary {
我上过这样的课: [DataContract(Namespace = "blah")] public class Item { [DataMember(Order = 0)] publ
我知道当你创建一个服务时你可以创建一个通用的 DataContract: [DataContract(Name = "Get{0}Request") public sealed class GetIt
我正在尝试将类 B 序列化为 ita 基类 A 的实例。 DataContractSerializer 不允许我这样做。 序列化失败的例子如下: class Program { [DataCo
我的数据最好被描述为“洋葱状”,因为每个外层都建立在它下面的一层之上。下面您将看到一个大大简化的版本(我的版本更深几层,但在每一层都表现出相同的行为)。 [CollectionDataContract
我正在设置 WCF 界面。我的数据契约(Contract)如下所示: [DataContract(Namespace = "wcf")] [KnownType(typeof(TypeFromLibra
我的数据最好被描述为“洋葱状”,因为每个外层都建立在它下面的一层之上。下面您将看到一个大大简化的版本(我的版本更深几层,但在每一层都表现出相同的行为)。 [CollectionDataContract
我不知道使用的是什么序列化程序,但在使用 datacontract 属性的 Name 属性时,我在序列化过程中看到了一些不一致的行为。 这是我正在做的一个例子: [XmlRoot(ElementNam
我是一名优秀的程序员,十分优秀!