class Person
{
public string m_name;
private int m_age; // << how do I serialize the darn little rat?
}
Run Code Online (Sandbox Code Playgroud)
简单的问题,但在尝试回答它时似乎是一个很大的混乱.
每个人都建议使用公共getter/setter,但我的应用程序太大,为每个成员制作一个getter/setter只会导致可维护性问题.
我是否被迫在这里创建自定义序列化,或者这些成员是否有魔术属性?
如何序列化私有类成员?
编辑#1:
大家好,对不起来感到抱歉,当我写这个问题时,我有点不高兴,试图找到解决方案几个小时后.
无论如何,这里有更多的事实:
1.我正在尝试XML序列化这个类.目前我正在使用System.Xml.Serialization.XmlSerializer.
2.我正在序列化为XML以获得版本兼容性,据我所知,二进制文件不能提供给我.
我希望有一个属性,如:
class Person
{
public string m_name;
[SerializeThat(ElementName="Age")]
private int m_age; // << how do I serialize the darn little rat?
}
Run Code Online (Sandbox Code Playgroud)
或者(继续事实#3)一个属于该类的属性,如下所示:
[Serializable(DoPrivate = true, DoProtected = true)]
class Person
{
public string m_name;
private int m_age; …Run Code Online (Sandbox Code Playgroud) 看到您可以将任何文档转换为字节数组并将其保存到磁盘,然后将文件重建为其原始格式(只要您的文件名包含元数据等).
你为什么要用等级来标记一个班级[Serializable]?这是一个相同的想法,"元数据"类型信息,所以当你将对象转换为它的类时,事物是否正确映射?
如何编写PostSharp方面以将属性应用于类?我正在考虑的场景是需要使用DataContract属性进行修饰的WCF实体(或域对象).它也应该有一个Namespace属性.像这样:
using System.Runtime.Serialization;
namespace MWS.Contracts.Search.V1
{
namespace Domain
{
[DataContract(Namespace = XmlNamespaces.SchemaNamespace)]
public class PagingContext
{
[DataMember]
public int Page { get; set; }
[DataMember]
public int ResultsPerPage { get; set; }
[DataMember]
public int MaxResults { get; set; }
}
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,您可以看到我想要输出的样子.它具有应用于类的DataContract属性.手工完成这项工作既乏味又不独特.我真的只想编写一个可以应用于我的"域"命名空间的方面.然后它将为我应用序列化相关属性.这样我就可以专注于开发实体对象,而不用担心序列化的细节.
我在PostSharp的网站上找到了用于在方法之前,之后和代替方法注入代码的文档.然而,我正在寻找的是一种将属性注入类型的方法.
这是解决方案!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using PostSharp.Aspects;
using PostSharp.Extensibility;
using PostSharp.Reflection;
namespace MWS.Contracts.Aspects
{
// We set up multicast inheritance so the aspect is automatically …Run Code Online (Sandbox Code Playgroud) Microsoft在其文章" 如何使用Visual C#将对象序列化为XML "中提供了代码.
using System;
public class clsPerson
{
public string FirstName;
public string MI;
public string LastName;
}
class class1
{
static void Main(string[] args)
{
clsPerson p=new clsPerson();
p.FirstName = "Jeff";
p.MI = "A";
p.LastName = "Price";
XmlSerializer x = new System.Xml.Serialization.XmlSerializer(p.GetType());
x.Serialize(Console.Out, p);
Console.WriteLine();
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,为什么类clsPerson不需要用[DataContract]或[Serializable]属性标记?