1

XML は、XMLSerialize シリアライゼーション/デシリアライゼーションを使用して、c# デスクトップ アプリケーションと同じ .NET によって生成およびロードされます。

シリアライズ可能なクラス構造は非常に複雑なので、関連する 2 つのクラスを選択しました。

ここで、デシリアライズすると、マッピング メッセージ (またはオブジェクト リストが組織で呼び出される方法としてのメッセージ) を除くすべてが読み込まれます。

誰かがこの動作について説明していますか?

すでに作成されたものを改善するためのヒントやヒントも常に高く評価されます。

ありがとうございました。

次の XML があります。

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xsd="Company.Test3.Crm.Crm2Queue.Config.xsd">
    <organizations>
        <organization name="Vanilla">
            <settings>
                <ignoreemptyfields>true</ignoreemptyfields>
                <throwerroronmissingconfiguration>true</throwerroronmissingconfiguration>
            </settings>
            <endpoints>
                <endpoint>
                    <serviceUri>http://www.webservicex.net/usaddressverification.asmx</serviceUri>
                </endpoint>
            </endpoints>
            <messages>
                <message name="account">
                    <field name="accountnumber" mappedname="State" />
                    <field name="address1_county" mappedname="Zip" />
                    <field name="address1_latitude" mappedname="City" />
                </message>
            </messages>
            <entities>
                <entity name="account" messageschema="/XSD/.xsd" identifier="accountid">
                    <events>
                        <event name="create" message="" />
                        <event name="update" message="" />
                        <event name="delete" message="" />
                    </events>
                </entity>
            </entities>
        </organization>
    </organizations>
</configuration>

シリアライズ可能なクラスは次のようになります。

[Serializable()]
public class Organization
{
    #region XmlIgnore

    [XmlIgnore()]
    public string Id { get; set; }

    [XmlIgnore()]
    public bool Checked { get; set; }

    [XmlIgnore()]
    public List<MappingMessage> mappingMessages { get; set; }

    #endregion

    #region Attributes

    [XmlAttribute("name")]
    public string Name { get; set; }

    #endregion

    #region Properties

    [XmlElement("settings")]
    public Settings Settings { get; set; }
    public bool ShouldSerializeSettings() { return (Settings != null && (Settings.IgnoreEmptyFields.HasValue || Settings.ThrowErrorOnMissingConfiguration.HasValue)); }

    [XmlArray("endpoints")]
    [XmlArrayItem("endpoint")]
    public List<Endpoint> Endpoints { get; set; }
    public bool ShouldSerializeignoreEndpoints() { return (Endpoints.Count > 0); }

    [XmlArray("messages")]
    [XmlArrayItem("message")]
    public List<MappingMessage> Messages 
    {
        get { return mappingMessages.Where(mm => (mm.Fields.Where(fi => !string.IsNullOrEmpty(fi.MappedName)).ToList().Count > 0)).ToList(); }
        set { mappingMessages = value; }
    }
    public bool ShouldSerializeFilledMappingMessages() { return (mappingMessages.Where(mm => (mm.Fields.Where(fi => !string.IsNullOrEmpty(fi.MappedName)).ToList().Count > 0)).ToList().Count > 0); }
    //public bool ShouldSerializeMappingMessages() { return (MappingMessages.Where(mm=> (mm.Fields.Where(fi=> !string.IsNullOrEmpty(fi.MappedName)).ToList().Count > 0)).ToList().Count > 0); }

    [XmlArray("entities")]
    [XmlArrayItem("entity")]
    public List<Entity> Entities { get; set; }
    public bool ShouldSerializeEntities() { return (Entities.Count > 0); }

    #endregion

    #region Constructors

    public Organization()
    {
        Settings = new Settings();
        Endpoints = new List<Endpoint>();
        mappingMessages = new List<MappingMessage>();
        Entities = new List<Entity>();
        Checked = false;
    }

    public Organization(string name)
        : this()
    {
        Name = name;
    }

    public Organization(string id, string name)
        : this(name)
    {
        Id = id;
    }

    #endregion
}


[Serializable()]
public class MappingMessage
{
    #region XmlIgnore

    [XmlIgnore()]
    public string EntityId { get; set; }


    [XmlIgnore()]
    public bool Checked { get; set; }

    [XmlIgnore()]
    public List<Field> Fields { get; set; }

    #endregion

    #region Attributes

    [XmlAttribute("id")]
    public string Id { get; set; }

    [XmlAttribute("name")]
    public string Name { get; set; }

    #endregion

    #region Properties

    [XmlElement("field")]
    public List<Field> SelectedFields
    {
        get
        {
            return Fields.Where(fi=> !string.IsNullOrEmpty(fi.MappedName)).ToList();
        }
        set
        {
            Fields = value;
        }
    }
    public bool ShouldSerializeSelectedFields() { return (SelectedFields.Count > 0); }

    [XmlElement("subentity")]
    public List<SubEntity> SubEntities { get; set; }
    public bool ShouldSerializeSubEntities() { return (SubEntities.Count > 0); }

    [XmlElement("parententity")]
    public List<ParentEntity> ParentEntities { get; set; }
    public bool ShouldSerializeParentEntities() { return (ParentEntities.Count > 0); }

    #endregion

    #region Constructors

    public MappingMessage()
    {
        Checked = false;
        Fields = new List<Field>();
        SubEntities = new List<SubEntity>();
        ParentEntities = new List<ParentEntity>();
    }

    public MappingMessage(string entityId)
        : this()
    {
        EntityId = entityId;
    }

    public MappingMessage(string entityId, string name)
        : this(entityId)
    {
        Name = name;
    }

    #endregion
}

そして、以下に示すように逆シリアル化を使用します。

foreach (ZipEntry zipEntry in zipFile)
                {
                    using (MemoryStream memoryStream = new MemoryStream())
                    {
                        if (zipEntry.FileName.ToLower().EndsWith(".crm.crm2queue.config.xml"))
                        {
                            using (StreamReader streamReader = new StreamReader(memoryStream, Encoding.UTF8))
                            {
                                zipEntry.Extract(memoryStream);
                                memoryStream.Position = 0;
                                XmlSerializer xmlSerializer = new XmlSerializer(typeof(Ciber.Crm.MappingCRMTo.Data.Configuration));
                                configuration = (Configuration)xmlSerializer.Deserialize(streamReader);
                            }
                        }
                    }
                }
4

1 に答える 1

1

デシリアライザーはリスト returne を埋めようとしpublic List<MappingMessage> Messagesます。シリアライザーがセッターを呼び出すには、プロパティの型を不変のコレクション型に変更する必要がありますMappingMessage[]

編集 : エンティティの自動プロパティをバッキング フィールドのあるプロパティに置き換え、getter と setter の両方にブレークポイントを設定できることを確認します。セッターでブレークする必要はなく、ゲッターでのみブレークする必要があります。

于 2013-02-20T15:20:12.787 に答える