0

ここでの前の質問で、シリアル化しようとしているxmlを投稿しました。別のXMLの例を次に示します。

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> 
    <System> 
        <Provider Name="XXXXXXXXXX" Guid="{YYYYYYYY}" />  
        <EventID>XYZ</EventID>  
        <Version>0</Version>  
        <Level>L</Level>  
        <Task>A</Task>  
        <Opcode>0</Opcode>  
        <Keywords>0x000xyzh</Keywords>  
        <TimeCreated SystemTime="2012-06-28T15:44:04.997837000Z" />  
        <EventRecordID>153</EventRecordID>  
        <Correlation ActivityID="{DDDDDDDDD}" />  
        <Execution ProcessID="199999" ThreadID="90990" />  
        <Channel>Microsoft-Windows-ABCDEFG/Admin</Channel>  
        <Computer>myPC</Computer>  
        <Security UserID="ABCABC" />  
    </System> 
    <EventData> 
        <Data Name="name1">data1</Data>  
        <Data Name="name2">data2</Data>  
        <Data Name="name3">data3</Data>  
        <ComplexData Name="XYZXYZ">0C004300310022002D004400460053005400450053002200310003004E0053003200230041002D00570041002D00320045004400000047006C002900620061006C0048006900670068005000720069006F007200240074006600120044006100730087000000000000000000000000000000</ComplexData> 
    </EventData> 
    <RenderingInfo Culture="en-US"> 
        <Message>some message </Message>  
        <Level>Information</Level>  
        <Task>XYZ</Task>  
        <Opcode>Info</Opcode>  
        <Channel />  
        <Provider />  
        <Keywords> 
            <Keyword>XYZ</Keyword>  
        </Keywords> 
    </RenderingInfo> 
</Event> 

1つの違いは、整数値(後続の文字列の長さ...など)と文字列ユニコードの配列を定義する構造体である複雑なデータがあることです。私はその文字列をバイトごとにデコードする方法を考え出しましたが、それを行うためのよりクリーンな方法が必要です。EventRecord.ToXml()が、複雑なデータ/構造体/配列を含むイベントペイロードを取得するための最良の方法ではない場合、それを取得するための最良の方法は何ですか。msdnにはWindowsイベント関連のクラスがたくさんあり、どれを使用すればよいかわかりません。

ありがとう

編集: これは私がComplexDataについて知っていることのいくつかのサンプルです:

              <data  
                  inType="win:UInt16"  
                  name="XYZLength"  
                  />  
              <data  
                  inType="win:UnicodeString"  
                  length="XYZLength"  
                  name="XYZ"  
                  />  

つまり、最初の2バイト(ローエンディアン形式)は、次のUnicode文字列の長さなどです。そして、長さがないものについては、16ビットのゼロ(2バイトのゼロ)であるヌル終端を見つける必要があります。

4

1 に答える 1

1
public class Event
{
    [XmlArrayItem(typeof(Data))]
    [XmlArrayItem(typeof(ComplexData))]
    public object[] EventData;
}

public class Data
{
    [XmlAttribute]
    public string Name { get; set; }

    [XmlText]
    public string Value { get; set; }
}

public class ComplexData
{
    [XmlAttribute]
    public string Name { get; set; }

    [XmlText(DataType = "hexBinary")]
    public byte[] Encoded { get; set; }
}

ドキュメントをお読みください:

于 2012-07-06T21:13:48.763 に答える